2015-06-23 3 views
1

У меня есть пара связанных SQL-серверов: ServerA и ServerB. Я хочу написать простой оператор INSERT INTO SELECT, который скопирует строку из базы данных ServerA в базу данных ServerB. База данных ServerB была скопирована непосредственно из ServerA, и поэтому они должны иметь точно такую ​​же базовую структуру (имена же колонки и т.д.)SQL INSERT sp_cursor Ошибка

Проблема заключается в том, что, когда я пытаюсь выполнить следующую инструкцию:

INSERT INTO [ServerB].[data_collection].[dbo].[table1] SELECT * FROM [ServerA].[data_collection].[dbo].[table1]

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

Msg 16902, Level 16, State 48, Line 1 sp_cursor: The value of the parameter 'value' is invalid.

с другой стороны, если я пытаюсь выполнить следующее заявление:

INSERT INTO [ServerB].[data_collection].[dbo].[table1] (Time) SELECT Time FROM [ServerA].[data_collection].[dbo].[table1]

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

Итак, мой вопрос в том, почему мой оператор INSERT INTO SELECT правильно работает, когда я явно укажу, какие столбцы копировать, но не тогда, когда я скажу ему копировать все, используя «*»? Тогда мой второй вопрос: как я могу исправить проблему?

+0

Обычно это указывает на то, что столбец по ошибке является столбцом Identity. С таким именем, как «Value», это кажется менее вероятным, но проверьте это и посмотрите, является ли Value Identity. Кроме того, дважды проверьте, действительно ли столбцы идентичны на обоих серверах. (имя, тип данных и порядок.) – DeadZone

+0

В таблице нет столбца с именем «Значение». Кроме того, что было бы самым быстрым способом проверить, что столбцы, по сути, полностью идентичны? (Для рассматриваемой таблицы имеется более 1000 столбцов, поэтому это займет очень много времени.) – Karasu

+0

Проверьте [это] (http://www.kepware.com/KEP_KB/?solution=/_ui/selfservice/pkb/PublicKnowledgeSolution/d? & id = 50140000000SUKxCsY). От чтения этого я думаю, что это связано с тем, что существует более 1000 столбцов и то, как INSERT INTO ... SELECT работает под капотом, вы нарушаете максимальную длину символа. Я бы предложил это в качестве ответа, если бы у меня была лучшая документация, чтобы поддержать его, а не просто теорию. – LDMJoe

ответ

0

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

Параметр «значение» не является одним из ваших столбцов, это необязательный аргумент sp_cursor, который называется неявно через ваш INSERT INTO ... SELECT.

От SQL Server Central ...

I have an ssis package that needs to populate a sql table with data from a pipe-delimited text file containing 992 (!) columns per record. ...Initially I'd set up the package to contain a data flow task to use an ole db destination control where the access mode was set to Table or view mode. For some reason though, when running the package it would crash, with an error stating the parameter 'value' was not valid in the sp_cursor procedure. On setting up a trace in profiler to see what this control actually does it appears it tries to insert the records using the sp_cursor procedure. Running the same query in SQL Server Management Studio gives the same result. After much testing and pulling of hair out, I've found that by replacing the sp_cursor statement with an insert statement the record populated fine which suggests that sp_cursor cannot cope when more than a certain number of parameters are attempted. Not sure of the figure.

Примечание общая тема здесь между ситуацией и один привел - это bazillion столбцы.

Этот же источник предлагает обходное решение.

I've managed to get round this problem however by setting the access mode to be "Table or view - fast load". Viewing the trace again confirms that SSIS attempts this via a "insert bulk" statement which loads fine.

+0

Простите мое незнакомое знание SQL. но как установить режим доступа в «Таблица или просмотр - быстрая загрузка»?После краткого поиска MSDN упомянул, что этот параметр можно найти в диспетчере назначения OLE DB Connection Manager/OLE DB, но я не знаю, как получить к нему доступ. – Karasu

+0

Чтобы снять это, похоже, вам придется выполнять свою работу в пакете [SSIS] (https://msdn.microsoft.com/en-us/library/ms141134.aspx). Ключ состоит в том, что под капотом выполняется «INSERT BULK», в отличие от 'SP_cursor' (который вызывал ошибку). Согласно [этому вопросу MSDN] (https://social.msdn.microsoft.com/Forums/sqlserver/en-US/d9bf8677-7138-457a-afae-948ae749465e/what-is-insert-bulk?forum=transactsql) нет доступа к нему напрямую - доступ к нему возможен только через API Bulk Insert. – LDMJoe

+0

Как выполнить его в пакете SSIS и использовать INSERT BULK? – Karasu