Переменная SSIS в задаче потока данных используется неправильно - PullRequest
0 голосов
/ 02 марта 2019

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

Когда я пытаюсь запустить его, яполучаю ошибку:

Синтаксическая ошибка, нарушение прав доступа или другая неспецифическая ошибка.

когда я изменяю ? на 1 в тексте команды SQL, код работает нормально.Так чего мне не хватает?

DECLARE @dt DATETIMEOFFSET = SWITCHOFFSET(CONVERT(DATETIMEOFFSET, GETDATE()), '-04:00')
DECLARE @interval INT = ?
SET @interval = -1 * @interval
DECLARE @DATE_OPG DATE
SELECT @DATE_OPG = A.DWH_PR_DATO
FROM TABLE AS A
WHERE YEAR(A.DWH_PR_DATO)=YEAR(DATEADD(MONTH,@interval,@dt)) AND
      MONTH(A.DWH_PR_DATO)=MONTH(DATEADD(MONTH,@interval,@dt)) 
ORDER BY A.DWH_PR_DATO DESC

SELECT DISTINCT COLUMN 1,
                COLUMN 1,
                COLUMN 1,
FROM TABLE 1
WHERE DATE_OPG=@DATE_OPG
UNION ALL
SELECT DISTINCT COLUMN 2,
                COLUMN 2,
                COLUMN 2,
FROM TABLE 2
WHERE DATE_OPG=@DATE_OPG
...

Снимок экрана

Program code

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Не думаю, что следующая ошибка - настоящая проблема.

Неверный синтаксис рядом с ')'.

Анализатор запросов не смог выполнить синтаксический анализзапрос, потому что вы добавили знак минус перед знаком вопроса ?.В этом ответе я попытаюсь выяснить основную причину ошибки, которую вы видите.

Тип данных параметра vs Тип данных переменной

На основе официального Источник OLEDB - Документация :

Параметры сопоставляются с переменными, которые предоставляют значения параметров во время выполнения.Переменные обычно являются пользовательскими переменными, хотя вы также можете использовать системные переменные, которые предоставляет Integration Services.Если вы используете пользовательские переменные, убедитесь, что вы установили тип данных, который совместим с типом данных столбца, на который ссылается сопоставленный параметр.

Это означает, что тип данных параметране связан с типом данных переменной.

Поэтому, когда вы используете -? внутри команды SQL, анализатор запросов не может идентифицировать метаданные параметра, даже если он сопоставлен с целочисленной переменной.

Вы можете проверить мой ответ по ссылке ниже, она содержит много деталей с экспериментами:


Решение проблемы

(1) Принудительный тип данных параметра

Попробуйте использовать функцию CAST() для принудительного ввода типа данных параметра.и назначьте его переменной так же, как вы объявили @dt:

DECLARE @interval INT = CAST(? as INT)
--If you want to get a negative number else ignore the row below
SET @interval = -1 * @interval
DECLARE @dt DATETIMEOFFSET = SWITCHOFFSET(CONVERT(DATETIMEOFFSET,GETDATE()),'-04:00');
DECLARE @DATE_OPG DATE;
SELECT @DATE_OPG = DWH_PR_DATEO
FROM TableName
WHERE YEAR(DWH_PR_DATO) = YEAR(DATEADD(MONTH,@interval ,@dt)) AND
MONTH(DWH_PR_DATO) = MONTH(DATEADD(MONTH,@interval ,@dt))
ORDER BY DWH_PR_DATO DESC

(2) Использование выражений

Вы можете использовать выражения при построенииSКоманда QL:

  1. Добавить переменную типа string (Пример: @[User::strQuery])
  2. Определить выражение в этой переменной:

    "DECLARE @dt DATETIMEOFFSET = SWITCHOFFSET(CONVERT(DATETIMEOFFSET,GETDATE()),'-04:00');
     DECLARE @DATE_OPG DATE;
     SELECT @DATE_OPG = DWH_PR_DATEO
     FROM TableName
     WHERE YEAR(DWH_PR_DATO) = YEAR(DATEADD(MONTH,-" + @[User::KOERSEL] + ",@dt)) AND
     MONTH(DWH_PR_DATO) = MONTH(DATEADD(MONTH,-" + @[User::KOERSEL] + ",@dt))
     ORDER BY DWH_PR_DATO DESC"
    
  3. В источнике OLEDB выберите команду SQL из переменной и выберите @[User::strQuery]


Эксперименты

Я пыталсяаналогичный запрос с использованием базы данных AdventureWorks:

DECLARE @dt DATETIMEOFFSET = SWITCHOFFSET(CONVERT(DATETIMEOFFSET, GETDATE()), '-04:00')
DECLARE @interval INT = CAST(? as INT)
SET @interval = -1 * @interval
DECLARE @DATE_OPG DATE
SELECT @DATE_OPG = A.[ModifiedDate]
FROM [AdventureWorks2016CTP3].[HumanResources].[Employee] AS A
WHERE YEAR(A.[ModifiedDate])=YEAR(DATEADD(MONTH,@interval,@dt)) AND
      MONTH(A.[ModifiedDate])=MONTH(DATEADD(MONTH,@interval,@dt)) 
ORDER BY A.[ModifiedDate] DESC

SELECT * FROM [AdventureWorks2016CTP3].[HumanResources].[Employee]
WHERE [ModifiedDate] = @DATE_OPG 

И запрос успешно проанализирован

enter image description here

0 голосов
/ 02 марта 2019

Вместо -? используйте следующую логику:

-1 * (CAST(? as int))

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

(CAST(? as int))

YouНевозможно присвоить параметру отрицательный знак, так как это вызовет некоторый конфликт, так как анализатор запросов не сможет определить тип данных параметра.

Если он по-прежнему вызывает исключение, проверьте следующую ссылку, в которой есть обходной путь:

...