Служба SSIS выполняет SQL-задание, содержащее вставку в и выбор

#sql #ssis #sp-executesql

#sql #Служба SSIS #sp-executesql

Вопрос:

Я пытаюсь прочитать имена файлов, а затем ввести каждое имя в строке с другим аналогичным значением ячейки в другой столбец таблицы. В каждом цикле For у меня есть задача Execute SQL. в настоящее время задача настроена на прямой ввод. Это сценарий проблемы

 INSERT INTO TableB
                  (LoopValue, Columnvalue)
VALUES     (?, N'Select Columnvalue from TableA where Columnvalue like ?')
  

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

1. Ожидается, что вы получите что-то другое, кроме буквальной строки Select Columnvalue from TableA where Columnvalue like ? , хранящейся в Columnvalue ? В этом проблема?

2. это подвыборка или вы хотите вставить текст сценария sql в действие? «Выберите значение столбца из таблицыа, где значение столбца нравится?» если это подвыборка, измените ‘ на (

3. Я столкнулся с этим сообщением об ошибке [Execute SQL Task] Ошибка: выполнение запроса «ВСТАВИТЬ В TableB (LoopValue, Columnvalue)» не удалось со следующей ошибкой: «Неправильный синтаксис рядом с ‘)'». Возможные причины сбоя: проблемы с запросом, свойство «ResultSet» установлено неправильно, параметры неустановлено правильно или соединение установлено неправильно. >>>> Я хочу вставить выбранные значения в таблицу

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

5. как выглядит результирующий набор данных? Пожалуйста, опубликуйте пример

Ответ №1:

У вас есть для каждого цикла над файлами, как я понял? Когда у меня возникают подобные ситуации, я просто сопоставляю текущий файл с переменной fileName, используя параметр «Сопоставление переменных» цикла foreach, используя индекс 0.

Затем я создаю задачу потока данных с производным столбцом, который является просто вашей переменной fileName. Использования этого в сочетании с назначением OLE DB должно быть достаточно для вставки значения в таблицу, если я правильно вас понимаю?

РЕДАКТИРОВАТЬ: О, вы тоже хотите создать строку? Вы могли бы добиться этого в своем потоке управления, используя задачу выражения. Назначьте строковую переменную, такую как «queryString», а затем:

 @queryString = "Select "   @[User::fileName]   " from Table B" 
  

или что-то в строках этого, т.Е. Используйте «» для вставки «жестко закодированных» значений и , за которым следует ваша переменная, для объединения вашей переменной. Затем вы также можете использовать производный столбец для вашей переменной @queryString в вашем потоке данных.

Ответ №2:

Вы близки, если я понимаю, что вы пытаетесь сделать, а именно вставить в TableB, выбирая записи из TableA, где значение столбца похоже на переданное значение.

В том виде, в котором вы его получили, он хочет вставить литеральную строку Select Columnvalue from TableA where Columnvalue like ? в вашу таблицу.

Настройте свой оператор следующим образом:

 INSERT INTO TableB (LoopValue, Columnvalue)
SELECT ?, Columnvalue  FROM TableA WHERE Columnvalue LIKE '%'   ?   '%' --% is a wildcard.   If you only want those that begin or end then remove one or the other %
  

Затем убедитесь, что вы передаете значение дважды. Поскольку существует несколько ? параметров, относящихся к числу параметров, но вы можете передать их дважды, поскольку вы используете одно и то же значение в двух разных местах:

введите описание изображения здесь

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