#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