Почему RODBC не загружает фрейм данных на SQL Server?

library(RODBC)
con <- odbcDriverConnect("driver=SQL Server; server=name")
df <- data.frame(a=1:10, b=10:1, c=11:20)

попытка загрузить фрейм данных:

sqlSave(con, df, tablename='[MyDatabase].[MySchema].[MyTable]', rownames=F)

>Error in sqlColumns(channel, tablename) : ‘MyDatabase.MySchema.MyTable’: table not found on channel

..в качестве альтернативы сначала создайте таблицу, а затем добавьте к ней:

cmd <- "create table [MyDatabase].[MySchema].[MyTable] ([a]  int, [b] int, [c] int)"
sqlQuery(con, cmd)

sqlSave(con, df, tablename='[MyDatabase].[MySchema].[MyTable]', rownames=F, append=T)

>Error in sqlSave(con, df, tablename = "MyTable", rownames = F, : 42S01 2714 [Microsoft][ODBC SQL Server Driver][SQL Server]There is already an object named MyDatabase.MySchema.MyTable in the database. [RODBC] ERROR: Could not SQLExecDirect 'CREATE TABLE MyDatabase.MySchema.MyTable ("a" int, "b" int, "c" int)'

что я делаю не так?

3 ответов


Если я добавлю скобки, я также получу ошибку.

Если я использую строку соединения с базой данных, чтобы убедиться, что я нахожусь в правильной базе данных (не master) и выполняю оператор sqlSave(con, df, tablename='dbo.MyTable4', rownames=F) или sqlSave(con, df, tablename='MyTable5', rownames=F) это работает.


при подключении к Microsoft SQL Server необходимо использовать odbcDriverConnect вместо odbcConnect для выполнения sqlSave заявления etc. Только odbcDriverConnect позволяет указать определенную базу данных в строке подключения.


RODBC смотрит на по умолчанию папка для подключения к серверу ODBC, чтобы узнать, есть ли у вас разрешения на запись (даже если вы собираетесь в подкаталог). Если у вас нет разрешения хозяина, то это не удается.

Мне пришлось создать два соединения внутри R, одно для чтения из Мастера и одно для записи в мой временный каталог. Они были установлены путем создания двух серверных подключений с помощью администрирования ODBC моего локального компьютера (в Win7):

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

- тот, который по умолчанию является каталогом сервера, на который у меня есть разрешения на запись/удаление.

другими словами, ваша проблема решена путем изменения ODBC-соединения вашей машины и указания R на новое соединение с сервером, которое вы сделаете (то, которое по умолчанию используется для вашей разрешенной для записи таблицы.