Попытка вызвать хранимую процедуру T-SQL, которая выбирает данные со связанного сервера в пакете SSIS

#sql-server #stored-procedures #ssis #linked-server

#sql-сервер #хранимые процедуры #ssis #связанный сервер

Вопрос:

У меня есть сценарий, в котором я пытаюсь выбрать некоторые данные в таблице t1 amp; t2 с удаленного сервера (на котором у меня просто есть разрешения на чтение) S1 в DB db1 с другого удаленного сервера (на котором я DBO, но на самом деле у меня нет всех разрешений, так что я могу делать все, что захочу) S2 в DB db2 в таблицу t1 через пакет SSIS.

Оба S1 и S2 являются связанными серверами. Я подключился к S1 из S2 через сервер объектов в SSMS.

Теперь я создал хранимую процедуру sp1 в S2.db2, которая содержит несколько инструкций select из двух разных таблиц с объединением для диапазона дат, которые передаются в качестве параметров в пакет sp1.

Входные параметры для SP

например, как показано ниже :

ВЫБЕРИТЕ * из s1.db1.schema1.t1 ЛЕВОЕ СОЕДИНЕНИЕ s1.db1.schema1.t2 При [УСЛОВИИ], ГДЕ [CONDITIONS] Теперь в моем пакете SSIS есть задача потока данных, которая имеет источник OLE DB и назначение со строкой подключения к s2.db2

В исходном коде я вызываю вышеупомянутый запрос непосредственно в команде SQL и заполняю таблицу назначения, которая является S2.db2.t1, и она работает нормально

Передача запроса напрямую

Но она выдает ошибку, когда я пытаюсь выполнить следующее

  1. Создайте 2 переменные DATETIME уровня пакета как v1, v2 и передайте значения по умолчанию — Без проблем
  2. В ИСХОДНОМ КОДЕ OLE DB -> СТРОКА ПОДКЛЮЧЕНИЯ -> КОМАНДА SQL -> EXEC sp1 ?, ? — Нет проблем
  3. перейдите на вкладку ПАРАМЕТРЫ и выберите оба пользовательских параметра для Parameter0 и parameter1 — Без проблем
  4. Теперь, когда я говорю «ок» для окна командной строки SQL, оно выдает мне ошибку следующего вида

Ошибка при вызове SP

Ошибка :

НАЗВАНИЕ: Microsoft Visual Studio

Ошибка в FII54_CBI_TM51 [FII54_CBI 1]: код ошибки SSIS DTS_E_OLEDBERROR. Произошла ошибка OLE DB. Код ошибки: 0x80004005. Доступна запись OLE DB. Источник: «Собственный клиент Microsoft SQL Server 10.0» Результат: 0x80004005 Описание: «Столкновение типов операндов: int несовместимо с датой».

Ошибка в FII54_CBI_TM51 [FII54_CBI 1]: не удается извлечь информацию о столбце из источника данных. Убедитесь, что ваша целевая таблица в базе данных доступна.


ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

Исключение из HRESULT: 0xC020204A (Microsoft.SQLServer.DTSPipelineWrap)


КНОПКИ:

ОК

Я понимаю, что означает ошибка, но я не понимаю, почему она вообще выдает эту ошибку.

Я признателен, если кто-нибудь может помочь мне решить эту проблему? Для меня это довольно срочно.

Комментарии:

1. 1) sp_help sp1 Отредактируйте свой запрос, добавив информацию о параметрах, которые принимает процедура. 2) В исходном коде OLE DB сделайте снимок экрана окна Set Query Parameters (доступно при нажатии Parameters …) 3) Сделайте снимок экрана вашего окна Variables. 4) Можете ли вы создать фиктивную процедуру sp2 в той же базе данных, что и sp1? Пусть она имеет ту же подпись, что и sp1, но не запрашивает никаких таблиц и, конечно же, не попадает на связанный сервер. Это поможет определить, является ли проблема связанным сервером, вашим запросом или вашим пакетом.

2. Привет.. Я не совсем понимаю необходимость шагов, которые вы предложили выше. Но, переходя к последнему пункту, то есть определению проблемы, я почти уверен, что проблема не в запросе или пакете. Я также не думаю, что проблема связана со связанным сервером, потому что, когда я пытаюсь вставить запрос связанного сервера, который находится непосредственно внутри пакета sp1, он работает просто отлично. Запрос также хорош, потому что он работал как в пакете SSIS, так и в SSMS, и то же самое с пакетом. Я полагаю, что это как-то связано с вызовом SP и связанных серверов вместе в пакете SSIS. Я никогда раньше не работал с этой комбинацией.

3. Возможно, вы это знаете, но мы, люди, пытающиеся предоставить возможные ответы на вашу проблему, этого не знаем. Звучит так, как будто имеет место несоответствие типов данных, поэтому я запросил подробности об интерфейсе между двумя системами. Наличие конкретных доказательств метаданных процедуры, сопоставления параметров и типов SSIS позволило бы людям, которые хотят помочь вам, увидеть детали проблемы. Мы можем обнаружить, что это не несоответствие, а в конечном итоге проблема с разрешениями, но я бы предпочел устранить вероятные причины, прежде чем искать что-то неясное.

4. Попался!!! Но когда я пытаюсь прикрепить снимок экрана в виде изображения, это выдает мне следующую ошибку: Упс! Не удалось отправить вашу правку, потому что: Мы сожалеем, но в качестве механизма предотвращения спама новым пользователям не разрешается публиковать изображения. Заработайте более 10 репутации за публикацию изображений. Пожалуйста, дайте мне знать, если есть какой-либо другой способ, которым я мог бы это выполнить.

5. Вскоре у вас должна быть достаточная репутация, попросил некоторых людей поддержать вопрос.

Ответ №1:

При использовании хранимой процедуры в качестве источника OLEDB вы должны убедиться, что внутри хранимой процедуры у вас есть:

 SET NOCOUNT ON;
  

и затем перед выполнением процедуры добавьте: SET FMTONLY OFF

 SET FMTONLY OFF;
EXEC CBI_MASTER_PID ?, ?
  

Можете ли вы попробовать это?