2017-02-02 7 views
1

Вот мой код:sqlSave и sqlDrop в R

library('RODBC') 
db.handle <- odbcDriverConnect('driver={SQL Server Native Client 11.0};server=server_name;database = db_name;trusted_connection=yes') 
sql_table <- 'db_name.table_name' 
sqlDrop(db.handle, sql_table, errors = TRUE) 
sqlSave(db.handle,df_small,tablename = sql_table,safer=FALSE,append=TRUE, 
     rownames = FALSE) 
close(db.handle) 

Когда я исполняю строку:

sqlDrop(db.handle, sql_table, errors = TRUE) 

Я получаю сообщение об ошибке:

Error in odbcTableExists(channel, sqtable, abort = errors) :
‘db_name.table_name’: table not found on channel

Когда я выполнить строку:

sqlSave(db.handle,df_small,tablename = sql_table,safer=FALSE,append=TRUE, 
      rownames = FALSE) 

я получаю следующее сообщение об ошибке:

Error in sqlSave(db.handle, df_small, tablename = sql_table, safer = FALSE, : 42S01 2714 [Microsoft][SQL Server Native Client 11.0][SQL Server] There is already an object named 'table_name' in the database.

[RODBC] ERROR: Could not SQLExecDirect 'CREATE TABLE db_name.table_name ("State_rename" varchar(255), "CoverageType" varchar(255))'

я выполнить код последовательно и не могу понять, как оба сообщения об ошибках могут быть правдой.

ответ

2

Рассмотрите возможность удаления схемы из таблицы sqltable, которую SQL Server использует с квалификатором периода. В частности, измените db_name.table_name на table_name. Причина, по которой вам не нужна эта схема, - это ваш дескриптор соединения, который уже указывает базу данных. При таком подключении вы не можете получить доступ к другим схемам базы данных на указанном сервере.

library('RODBC') 

db.handle <- odbcDriverConnect(paste0('driver={SQL Server Native Client 11.0};', 
           'server=server_name;database=db_name;trusted_connection=yes')) 

sql_table <- 'table_name' 
sqlDrop(db.handle, sql_table, errors = TRUE) 
sqlSave(db.handle, df_small, tablename = sql_table, safer = FALSE, 
     append = TRUE, rownames = FALSE) 
close(db.handle) 

Кстати, вы можете просто использовать append=FALSE, который перепишет таблицу (первое падение, а затем повторно создать его) без необходимости вызывать sqlDrop:

sqlSave(db.handle, df_small, tablename = sql_table, safer = FALSE, 
     append = FALSE, rownames = FALSE) 
+0

Спасибо за предложение. Теперь 'sqlDrop' генерирует ошибку' Ошибка в odbcTableExists (channel, sqtable, abort = errors): 'table_name': таблица не найдена на канале, а sqlSave генерирует ошибку 'Ошибка в sqlSave (db.handle, df_small, tablename = sql_table, более безопасный = FALSE,: 42000 262 [Microsoft] [SQL Server Native Client 11.0] [SQL Server] Разрешено CREATE TABLE в базе данных «master». [RODBC] ОШИБКА: не удалось SQLExecDirect 'CREATE TABLE имя_таблицы ("State_rename" varchar (255), «CoverageType» varchar (255)) '' – user1700890

+0

Хмммм ... что такое истинное имя таблицы *? Это может быть [зарезервированное слово] (https://msdn.microsoft.com/en- us/library/ms189822.aspx). Можете ли вы подтвердить таблицу базы данных в Management Studio или другой консоли? – Parfait