У меня возникли проблемы с созданием таблицы с помощью RODBC sqlSave (или, точнее, с записью данных в созданную таблицу).
Это отличается от существующих вопросов/ответов sqlSave, поскольку
- проблемы, с которыми они сталкивались, были другими, я могу создавать таблицы, а они не могут, и
- Я уже безуспешно включил их решения, такие как закрытие и повторное открытие соединения перед запуском sqlSave, а также
- Сообщение об ошибке отличается, за исключением сообщения, которое отличается двумя указанными выше способами.
Я использую MS SQL Server 2008 и 64-битный R на Windows RDP.
У меня есть простой фрейм данных только с 1 столбцом, состоящим из 3, 4 или 5-значных целых чисел.
> head(df)
colname
1 564
2 4336
3 24810
4 26206
5 26433
6 26553
Когда я пытаюсь использовать sqlSave, данные в таблицу не записываются. Кроме того, сообщение об ошибке звучит так, как будто таблица не может быть создана, хотя на самом деле таблица создается с 0 строками.
Основываясь на предложении, которое я нашел, я попытался закрыть и снова открыть соединение RODBC прямо перед запуском sqlSave. Несмотря на то, что я использую append = TRUE
, я пытался удалить таблицу перед этим, но это ни на что не влияет.
> 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)'
Я также пытался использовать sqlUpdate() для таблицы после ее создания. Неважно, создам ли я его в R или в SQL Server Management Studio, я получаю сообщение об ошибке table not found on channel
Наконец, обратите внимание, что я также пробовал это без append = TRUE и при создании новой таблицы, а также с параметром rownames и без него.
Мистер Флик из Freenode's #R попросил меня проверить, могу ли я читать пустую таблицу с помощью sqlQuery, и действительно могу.
Обновить
Я стал немного ближе со следующими шагами:
- Я создал соединение ODBC, которое идет непосредственно к моей базе данных в SQL Server, а не только к базе данных по умолчанию (Master) DB, а затем указал путь к таблице в операторах
table =
илиtablename =
. - Создал таблицу в SQL Server Management Studio следующим образом
GO
CREATE TABLE [dbo].[testing123](
[Person_DIMKey] [int] NULL
) ON [PRIMARY]
GO
В R я использовал
sqlUpdate
с моим новым подключением ODBC и без скобок вокруг имени таблицы.Теперь sqlUpdate() видит таблицу, однако жалуется, что ей нужен уникальный столбец
Указание того, что единственный столбец в таблице является уникальным столбцом с
index = colname
, приводит к ошибке, говорящей о том, что столбец не существует.Я удалил и воссоздал таблицу, указав первичный ключ,
GO
CREATE TABLE [dbo].[jive_BNR_Person_DIMKey](
[jive_BNR_Person_DIMKey] [int] NOT NULL PRIMARY KEY
) ON [PRIMARY]
GO
который сгенерировал как первичный ключ, так и индекс (в соответствии с графическим интерфейсом SQL Sever Management Studio) с именем PK__jive_BNR__2754EC2E30F848ED
- Я указал этот индекс/ключ как уникальный столбец в sqlUpdate(), но получаю следующую ошибку:
Error in sqlUpdate(db4, jive_BNR_Person_DIMKey, tablename = "jive_BNR_Person_DIMKey", :
index column(s) PK__jive_BNR__2754EC2E30F848ED not in database table
Для записи я указывал правильное имя столбца (не «colname») для индекса; спасибо MrFlick за запрос разъяснений.
Кроме того, в моем посте эти шаги пронумерованы от 1 до 7, но StackOverflow несколько раз сбрасывает нумерацию списка при его отображении. Если кто-нибудь может помочь мне очистить этот аспект этого сообщения, я был бы признателен.