Ошибка SQL INSERT sp_cursor

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

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

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 работает правильно, когда я явно указываю, какие столбцы копировать, но не когда я говорю ему копировать все, используя «*»? Мой второй вопрос тогда будет: как мне решить проблему?


person Karasu    schedule 23.06.2015    source источник
comment
Обычно это указывает на то, что столбец по ошибке является столбцом Identity. С таким именем, как Value, это кажется менее вероятным, но проверьте это и посмотрите, является ли Value идентификатором. Кроме того, дважды проверьте, действительно ли столбцы идентичны на обоих серверах. (в имени, типе данных и порядке.)   -  person DeadZone    schedule 23.06.2015
comment
В таблице нет столбца с именем Значение. Кроме того, какой самый быстрый способ проверить, что столбцы на самом деле полностью идентичны? (Для рассматриваемой таблицы более 1000 столбцов, так что это займет очень много времени.)   -  person Karasu    schedule 23.06.2015
comment
Проверьте это. Прочитав это, я думаю, что это связано с тем, что существует более 1000 столбцов и то, как INSERT INTO...SELECT работает под капотом, вы нарушаете максимальную длину символа. Я бы предложил это в качестве ответа, если бы у меня была лучшая документация, подтверждающая это, а не просто теория.   -  person LDMJoe    schedule 23.06.2015
comment
Я только что быстро проверил свою программу, генерирующую данные — она сгенерировала 766 столбцов, а не 1000+, как я предполагал ранее.   -  person Karasu    schedule 23.06.2015
comment
Я запустил инструмент сравнения Red Gate, и он показал, что две базы данных абсолютно одинаковы.   -  person Karasu    schedule 23.06.2015


Ответы (1)


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

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

Из SQL Server Central...

У меня есть пакет ssis, который должен заполнить таблицу sql данными из текстового файла с разделителями, содержащими 992 (!) столбца на запись. ... Первоначально я настроил пакет так, чтобы он содержал задачу потока данных, чтобы использовать элемент управления назначения ole db, где режим доступа был установлен на режим таблицы или режим просмотра. Однако по какой-то причине при запуске пакета происходил сбой с ошибкой, указывающей, что параметр 'value' недействителен в процедуре sp_cursor. При настройке трассировки в профилировщике, чтобы увидеть, что на самом деле делает этот элемент управления, кажется, что он пытается вставить записи, используя процедуру sp_cursor. Выполнение того же запроса в SQL Server Management Studio дает тот же результат. После долгих испытаний и выдергивания волос я обнаружил, что при замене оператора sp_cursor оператором вставки запись заполняется нормально, что говорит о том, что sp_cursor не может справиться с попытками ввода более определенного количества параметров . Не уверен в фигуре.

Обратите внимание на общую тему между вашей ситуацией и той, что цитируется, - миллион столбцов.

Тот же источник также предлагает обходной путь.

Однако мне удалось обойти эту проблему, установив режим доступа «Таблица или просмотр — быстрая загрузка». Повторный просмотр трассировки подтверждает, что SSIS пытается это сделать с помощью инструкции «insert bulk», которая загружается нормально.

person LDMJoe    schedule 23.06.2015
comment
Простите мои мизерные знания SQL. а как установить режим доступа Таблица или просмотр - быстрая загрузка? После непродолжительного поиска в MSDN упомянули, что этот параметр можно найти в диспетчере соединений OLE DB / редакторе назначения OLE DB, но я не знаю, как получить к нему доступ. - person Karasu; 24.06.2015
comment
Чтобы осуществить это, похоже, вам придется выполнять свою работу в Пакет служб SSIS. Суть в том, что под капотом выполняется INSERT BULK, а не SP_cursor (который выдавал ошибку). Согласно этот вопрос MSDN невозможно получить к нему прямой доступ — он доступен только через API массовой вставки. - person LDMJoe; 24.06.2015
comment
Как выполнить его в пакете SSIS и использовать INSERT BULK? - person Karasu; 24.06.2015
comment
Используя таблицу или представление - быстрая загрузка в настройках назначения для режима доступа к данным - я нашел здесь ответ на другой вопрос, который включает скриншот того, как его установить. - person LDMJoe; 24.06.2015
comment
Как получить доступ к редактору назначения OLE DB? - person Karasu; 24.06.2015
comment
В пакете SSIS перейдите на вкладку «Поток данных», нажмите Control+Alt+X, чтобы отобразить панель инструментов. На панели инструментов в разделе «Места назначения потока данных» (или «Другие места назначения», в зависимости от версии) выберите место назначения OLE DB и перетащите его на вкладку «Поток данных». Дважды щелкните по нему, чтобы открыть свойства, которые будут выглядеть как скриншот, ссылка на который приведена в предыдущем комментарии. - person LDMJoe; 24.06.2015
comment
Как получить доступ к пакету SSIS? - person Karasu; 25.06.2015
comment
Ты создашь его, и, похоже, он будет твоим первым. Это руководство MSDN — хорошее место для начала. Возможно, вы захотите рассмотреть возможность завершения этого вопроса, поскольку на исходный вопрос дан ответ. Я ожидаю, что по мере обучения у вас будет больше вопросов о SSIS, и создание новых вопросов для этих конкретных препятствий привлечет внимание сообщества в целом, а не только меня. - person LDMJoe; 25.06.2015
comment
Я сделал несколько открытий. Оказывается, я могу вставлять записи с удаленного сервера на локальный сервер, например выполнение сценария, поступающего с сервера A, который вставляет с сервера B на сервер A, или выполнение сценария, поступающего с сервера B, который вставляет с сервера A на сервер B. Однако я не могу вставлять записи с локального на удаленный сервер. Похоже, это указывает на то, что это проблема с правами доступа, а не sp_cursor, просто неспособная обрабатывать 766 столбцов. - person Karasu; 26.06.2015