Вставить фрейм данных R в SQL (RODBC) - таблица ошибок не найдена

Я хотел бы удалить весь свой фрейм данных из R, предпочтительно используя RODBC с оператором sqlSave (не sqlQuery). Вот мой пример кода.

library(RODBC)
myconn <- odbcDriverConnect("some connection string")
mydf <- data.frame(col_1 = c(1,2,3), col_2 = c(2,3,4))
sqlSave(myconn, mydf, tablename = '[some_db].[some_schema].[my_table]',  append = F, rownames = F,  verbose=TRUE)
odbcClose(myconn)

После того, как я его выполняю, я получаю обратно сообщение об ошибке:

Ошибка в sqlColumns (канал, имя таблицы): «my_table»: таблица не найдена на канале

Когда я проверяю SQL Server, присутствует пустая таблица.

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

Ошибка в sqlSave (myconn, mydf, tablename = [some_db]. [some_schema]. [my_table],: 42S01 2714 [Microsoft] [Драйвер ODBC 17 для SQL Server] [SQL Server] Уже существует объект с именем «my_table» в база данных.[RODBC] ОШИБКА: не удалось SQLExecDirect 'СОЗДАТЬ ТАБЛИЦУ [some_db].[some_schema].[my_table] (col_1 float, col_2 float)'

Любые предложения по устранению неполадок?

ОБНОВЛЕНИЕ

В SSMS я могу успешно выполнить следующие команды:

CREATE TABLE [some_db].[some_schema].[my_table] (
    test int
);
drop table [some_db].[some_schema].[my_table]

Вот подробности строки подключения:

Driver=ODBC Driver 17 for SQL Server; Server=someserveraddress; Uid=user_login; Pwd=some_password

person user1700890    schedule 19.02.2021    source источник
comment
Я не могу воссоздать проблему; этот код работает для меня в моей среде. Возможно ли, что есть проблема с правами доступа к базе данных SQLServer, в которую вы пишете? Возможно, попробуйте другую базу данных или явно укажите базу данных в соединении ODBC?   -  person Colin H    schedule 22.02.2021
comment
Вы хотите сохранить его в определенной схеме в базе данных? Работает ли это, если вы запускаете код SQL напрямую?   -  person tester    schedule 22.02.2021
comment
@tester, да, мой полный путь [some_db].[some_schema].[some_table]. Когда я подключаюсь к SQL Server, я не указываю имя базы данных. Я не уверен, что вы имеете в виду, когда я запускаю код напрямую.   -  person user1700890    schedule 22.02.2021
comment
Где вы указываете схему, в которую хотите писать? Я спрашиваю, потому что у меня были похожие проблемы при попытке вставить таблицу в нашу базу данных SQL с помощью RPostgreSQL. В конце концов я решил записать таблицу в [some_db] с помощью dbWriteTable, а затем переместить ее в [some_schema] напрямую с помощью SQL-запроса, потому что больше ничего не работало, и оказалось, что проблема была в драйвере. Следовательно, я бы попытался сначала проверить, работает ли он с использованием чистого SQL.   -  person tester    schedule 22.02.2021
comment
@tester, я обновил свой пост, чтобы ответить на ваш вопрос.   -  person user1700890    schedule 22.02.2021
comment
@tester dbWriteTable это разные пакеты odbc и DBI, если я правильно помню, я тоже их попробую.   -  person user1700890    schedule 22.02.2021
comment
Я лично много раз подтверждал этот тест: DBI намного быстрее, чем RODBC. Есть ли конкретная причина, по которой вы бы предпочли RODBC DBI?   -  person Waldi    schedule 22.02.2021
comment
@Waldi RODBC обычно проще установить.   -  person user1700890    schedule 22.02.2021
comment
@ user1700890, можете ли вы указать версию SQL Server, которую вы используете?   -  person sgoley    schedule 22.02.2021
comment
Я понимаю. Однако установка делается один раз, а медлительность в запросах - каждый раз при использовании ;-)   -  person Waldi    schedule 22.02.2021
comment
@sgoley Как я могу узнать версию SQL Server, я предполагаю, что это 2012 год.   -  person user1700890    schedule 22.02.2021
comment
Вы можете запустить SELECT @@VERSION в SSMS.   -  person sgoley    schedule 22.02.2021
comment
@sgoley, вот что вернула ваша команда: Microsoft SQL Azure (RTM) - 12.0.2000.8 Oct 1 2020 18:48:35 Copyright (C) 2019 Microsoft Corporation   -  person user1700890    schedule 22.02.2021
comment
Это кажется связанным   -  person Waldi    schedule 22.02.2021
comment
не могли бы вы поделиться строкой подключения, которую вы используете в odbcDriverConnect?   -  person Waldi    schedule 22.02.2021
comment
вы пытались удалить скобки?   -  person Waldi    schedule 22.02.2021
comment
@Waldi, я добавил строку подключения и да, я попытался удалить скобки с тем же результатом.   -  person user1700890    schedule 22.02.2021
comment
Хорошо спасибо. Ссылка выше предлагает указать database= в строке подключения, чтобы избежать проблем. затем вы можете вызвать sqlSave без базы данных в скобках. Я не знаю, как указать схему. Возможно сначала попробовать без схемы.   -  person Waldi    schedule 22.02.2021
comment
@Waldi, db в строке подключения и без скобок в схеме и таблице работали! Вы можете опубликовать его как ответ и получить награду. Спасибо за помощь!   -  person user1700890    schedule 22.02.2021


Ответы (1)


Чтобы избежать ошибки, вы можете указать базу данных в строке подключения:

Driver=ODBC Driver 17 for SQL Server; Server = someserveraddress; database = some_db; Uid = user_login; Pwd = some_password

и избегайте использования квадратных скобок:

sqlSave(myconn, mydf, tablename = 'some_schema.my_table',  append = F, rownames = F,  verbose=TRUE)
person Waldi    schedule 22.02.2021