RODBC sqlSave la création de la table des problèmes
Je vais avoir des problèmes lors de la création d'une table à l'aide de RODBC de sqlSave (ou, plus exactement, de l'écriture de données à la création de la table).
Ce qui est différent de l'existant sqlSave de questions/réponses, comme
- les problèmes qu'ils rencontraient étaient différents, je peux créer des tables alors qu'ils ne pouvaient pas et
- J'ai déjà unsuccesfully incorporé leurs solutions, telles que la fermeture et la réouverture de la connexion avant de lancer sqlSave, aussi
- Le message d'erreur est différent, à la seule exception d'un post qui était différent dans le au-dessus de 2 façons
Je suis à l'aide de MS SQL Server 2008 64-bit R sur un Windows RDP.
J'ai un simple bloc de données avec seulement 1 colonne complète de 3, 4 ou 5 chiffres entiers.
> head(df)
colname
1 564
2 4336
3 24810
4 26206
5 26433
6 26553
Lorsque j'essaie d'utiliser sqlSave, aucune donnée n'est écrite au tableau. En outre, un message d'erreur ressemble le tableau ne peut pas être créé si la table n'a en fait créé avec 0 ligne.
Fondée sur une proposition que j'ai trouvé, j'ai essayé de fermeture et de réouverture de la RODBC connexion juste avant l'exécution de sqlSave. Même si je les utilise append = TRUE
, j'ai essayé de la suppression de la table avant de faire cela, mais il n'a pas d'incidence sur quoi que ce soit.
> sqlSave(db3, df, table = "[Jason].[dbo].[df]", append = TRUE, rownames = FALSE)
Error in sqlSave(db3, df, table = "[Jason].[dbo].[df]", :
42S01 2714 [Microsoft][ODBC SQL Server Driver][SQL Server]There is already
an object named 'df' in the database.
[RODBC] ERROR: Could not SQLExecDirect 'CREATE TABLE [Jason].[dbo].[df]
("df" int)'
J'ai aussi essayé d'utiliser sqlUpdate() sur la table une fois, il a été créé. Ce n'est pas grave si je le crée dans R ou dans SQL Server Management Studio, j'obtiens l'erreur table not found on channel
Enfin, notez que j'ai aussi essayé sans append = TRUE et lors de la création d'une nouvelle table, ainsi qu'avec et sans le rownames option.
M. Flick de Freenode s #R a moi de vérifier si je pouvais le lire dans la table vide à l'aide de sqlQuery et en effet, je peux.
Mise à jour
J'ai eu un peu de plus près les étapes suivantes:
- J'ai créé une connexion ODBC qui va directement à ma Base de données dans SQL Server, au lieu de simplement à la valeur par défaut (Master) DB puis en spécifiant le chemin d'accès à la table dans le
table =
outablename =
états - La création de la table dans SQL Server Management Studio comme suit
GO
CREATE TABLE [dbo].[testing123](
[Person_DIMKey] [int] NULL
) ON [PRIMARY]
GO
-
Dans la R j'ai utilisé
sqlUpdate
avec ma nouvelle connexion ODBC et pas de parenthèses autour du nom de la table -
Maintenant sqlUpdate() voit le tableau, cependant il se plaint qu'il a besoin d'une colonne unique
-
Indiquant que la seule colonne de la table est l'unique colonne avec
index = colname
résultats dans un message d'erreur indiquant que la colonne n'existe pas -
J'ai supprimé et recréé la table de spécification d'une clé primaire,
GO
CREATE TABLE [dbo].[jive_BNR_Person_DIMKey](
[jive_BNR_Person_DIMKey] [int] NOT NULL PRIMARY KEY
) ON [PRIMARY]
GO
qui a généré à la fois d'une Clé Primaire et de l'Index (en fonction de l'interface graphique utilisateur de SQL server Management Studio) nommé PK__jive_BNR__2754EC2E30F848ED
- J'ai précisé que cet indice/touche que la colonne unique dans sqlUpdate (), mais j'obtiens l'erreur suivante:
Error in sqlUpdate(db4, jive_BNR_Person_DIMKey, tablename = "jive_BNR_Person_DIMKey", :
index column(s) PK__jive_BNR__2754EC2E30F848ED not in database table
Pour l'enregistrement, j'ai été en spécifiant le bon nom de la colonne (pas de "colname") pour l'indice; grâce à MrFlick pour demander des éclaircissements.
Aussi, ces étapes sont numérotées de 1 à 7 dans mon post mais StackOverflow réinitialise la numérotation de la liste de quelques-uns des moments où il est affiché. Si quelqu'un peut m'aider à nettoyer l'aspect de ce post, je l'apprécierais.
- J'ai réouvert ce parce que je pense que @Andrie peut-être été un peu vite en besogne. Le potentiel de double n'ont pas de réponse claire, et vous semblez avoir déjà essayé la principale suggestion de toute façon.
- Soyez conscient, cependant, que ces sortes de questions peut être difficile pour les personnes sans accès à votre base de données à l'aide. (Au moins pour la R des gens qui peuvent ou peuvent ne pas être en db experts.) Une possibilité est que le R est de tenter d'ajouter, mais en quelque sorte la structure de la table ne correspond pas à votre bloc de données assez bien, il est tentant d'en créer un nouveau et de l'échec, parce qu'un tableau de ce nom existe.
- Juste assez. J'ai aussi essayé sans append = TRUE et la création d'une nouvelle table, j'ai eu le même problème.
- Merci, @joran je ne suis pas encore habitué à ces nouveaux super-pouvoirs. Je voulais marquer le double, ne pas tuer la question complètement.
Vous devez vous connecter pour publier un commentaire.
Après re-lecture de la RODBC vingette et voici la solution simple qui a fonctionné:
Fait.
Après avoir expérimenté avec beaucoup plus pendant plusieurs jours, il semble que les problèmes qui découlent de l'utilisation des options supplémentaires, particularlly
table =
ou, de manière équivalente,tablename =
. Ceux-ci devraient être valide les options, mais d'une certaine manière, ils parviennent à provoquer des problèmes avec ma version de RStudio ((Windows, 64 bits, la version de bureau, actuel de construire), R (Windows, 64 bits, v3), et/ou MS SQL Server 2008.sqlSave(db, df)
permettra également de travailler sanssqlDrop(db, "df")
si la table n'a jamais existé, mais comme une meilleure pratique, je suis en train d'écriretry(sqlDrop(db, "df", errors = FALSE), silent = TRUE)
avant toutsqlSave
états dans mon code.Après des heures de travail sur ce, j'ai finalement été en mesure d'obtenir sqlSave de travailler tout en spécifiant le nom de la table--profonde respiration, par où commencer. Voici la liste des choses que j'ai fait pour obtenir que cela fonctionne:
odbcConnection(Name)
. Voici mon codemyconn2 <- odbcConnect("SYSTEMDB")
.columnTypes <- list(Record = "VARCHAR(10)", Case_Number = "VARCHAR(15)", Claim_Type = "VARCHAR(15)", Block_Date = "datetime", Claim_Processed_Date = "datetime", Status ="VARCHAR(100)")
.as.character
etas.Date
pour correspondre aux types de données énumérés ci-dessus.sqlDrop(myconn2, "##R_Claims_Data")
.sqlSave(myconn2, MainClmDF2, tablename = "##R_Claims_Data", verbose=TRUE, rownames= FALSE, varTypes=columnTypes)
Puis ma tête est tombé parce qu'il a travaillé! J'espère vraiment que cela aide quelqu'un à l'avenir. Voici les liens qui m'ont aidé à arriver à ce point:
Table introuvable
sqlSave dans la R
RODBC
Voici quelques règles de base:
VARCHAR(255)
. Traiter cela comme un temp ou la mise en scène de la table, et de déplacer les données avecsqlQuery
avec votre prochaine étape, tout comme @danas.zuokas suggéré. Cela devrait fonctionner, mais même si elle ne le fait pas, il vous permet de vous rapprocher du métal et vous met dans une meilleure position pour déboguer le problème avec le générateur de profils SQL Server si vous en avez besoin. <- Et oui, si vous avez encore un problème, il est probablement dû à une erreur d'analyse ou de conversion de type.logical
type (c'est à dire[TRUE, FALSE]
) ne sera pas convertir de T-SQLBIT
type ([1, 0]), alors n'essayez pas de le faire. Soit convertir lalogical
tapez sur [1, 0] dans la couche R ou de le ramener à la SQL couche comme unVARCHAR(5)
et la convertir en uneBIT
dans le SQL de la couche.En outre certains répondu posté plus tôt, voici ma solution de contournement. NOTE: j'utilise ce dans le cadre d'un petit ETL processus, et la table de destination dans la base de données est supprimé et recréé à chaque fois.
Fondamentalement, vous voulez le nom de votre dataframe ce que vous de la table de destination est nommé:
Alors assurez-vous que votre chaîne de connexion comprend la base de données cible (et pas seulement de serveur):
après, j'ai l'exécution d'un simple sqlQuery que conditionnellement gouttes de la table si elle existe:
Puis, finalement, les sqlSave sans le nom de la table param, ce qui permettra de créer la table et la remplir avec votre dataframe:
Nous avons eu ce même problème, qui, après un peu de tests nous avons résolu simplement par pas à l'aide de crochets dans le schéma et le nom de la table de référence.
c'est à dire plutôt que d'écrire
au lieu d'écrire
Apprécier ce qui est maintenant passé à la question d'origine, mais juste pour quelqu'un d'autre qui, par la suite des voyages sur ce problème, c'est comment nous avons résolu. Pour référence, nous avons découvert cela par l'écriture d'un simple 1 point dataframe à une nouvelle table, qui lors de l'inspection dans SQL figurant entre crochets dans le nom de la table.
J'ai rencontré le même problème, j'ai trouvé autour de il est de créer une table vide en utilisant régulièrement
CREATE TABLE
la syntaxe SQL, puis d'en ajouter viasqlSave
. Pour quelque raison, quand je l'ai essayé votre chemin, je pouvais voir le nom de la table dans la base de données MSSQL - même après R a jeté le message d'erreur vous a montré ci - dessus, mais il serait vide.df
dans la syntaxe normale, puis refaire la table dans la syntaxe normale, puis ajouter danssqlSave