Ошибка выполнения задачи SQL: не удалось выполнить запрос со следующей ошибкой: «Неправильный синтаксис рядом «.»

#variables #ssis #expression #foreach-loop-container #execute-sql-task

#переменные #ssis #выражение #foreach-цикл-контейнер #execute-sql-task

Вопрос:

Я работаю над пакетом SSIS, который отклоняет уже загруженные файлы и загружает только новые файлы в таблицу. Я использовал for each loop и exceute SSQLДЛЯ проверки, если файлы уже загружены. Когда я оцениваю выражение Execute SQL Task, оно вычисляется нормально. Но когда я запускаю пакет, я получаю следующую ошибку.

Ошибка [Выполнить задачу SQL]: выполнение запроса «ОБЪЯВИТЬ @FileName VARCHAR(100) SET @FileName=Custo …» завершилось неудачно со следующей ошибкой: «Неправильный синтаксис рядом».». Возможные причины сбоя: проблемы с запросом, неверно заданное свойство «ResultSet», неверно заданные параметры, или соединение установлено неправильно.

Выражение, которое я использовал в задаче Execute SQL, является :

«ОБЪЯВИТЕ @FileName VARCHAR(100) УСТАНОВИТЕ @FileName=» @[User::FileName] «‘ ЕСЛИ СУЩЕСТВУЕТ (ВЫБЕРИТЕ 1 ИЗ [dbo] .[FileLoadStatus] ГДЕ filename =@FileName) BEGIN ВЫБЕРИТЕ 1 КАК FileExistsFlg END ELSE BEGIN Выберите 0 КАК FileExistsFlg END»

снимок экрана задачи execute SQL

Я действительно ценю, можете ли вы сказать, в чем проблема?

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

1. Я вижу двойную пару запятых «» после @[User::FileName] … Я думаю, что это должно быть только одно »

Ответ №1:

Вы могли бы немного упростить свое выражение, чтобы прояснить, где используется переменная SSIS:

 "SELECT COUNT(*) AS FileExistsFlg 
FROM (
    SELECT TOP(1) * 
    FROM
        dbo.FileLoadStatus
    WHERE
        [filename] = '"   @[User::FileName]   "'
) x;"
  

С другой стороны, для задачи SQL вы могли бы использовать стандартный параметризованный запрос. Предполагая, что вы используете OLEDB-соединение, заполнителем параметра является ? знак. Выражение не требуется, и эквивалентный прямой ввод для задачи:

 SELECT COUNT(*) AS FileExistsFlg 
FROM (
    SELECT TOP(1) * 
    FROM
        dbo.FileLoadStatus
    WHERE
        [filename] = ?
) x;
  

С OLEDB вы должны сопоставить свою переменную с заполнителем по позиции (на основе нуля), поэтому в этом случае имя параметра равно нулевому числу. Другие свойства зависят от ваших метаданных и соответствуют переменной, которую вы должны объявить в SQL…
Сопоставление параметров

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

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