Почему 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 на новое соединение с сервером, которое вы сделаете (то, которое по умолчанию используется для вашей разрешенной для записи таблицы.