Не думаю, что следующая ошибка - настоящая проблема.
Неверный синтаксис рядом с ')'.
Анализатор запросов не смог выполнить синтаксический анализзапрос, потому что вы добавили знак минус перед знаком вопроса ?
.В этом ответе я попытаюсь выяснить основную причину ошибки, которую вы видите.
Тип данных параметра 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:
- Добавить переменную типа string (Пример:
@[User::strQuery]
) Определить выражение в этой переменной:
"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"
В источнике 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
И запрос успешно проанализирован