簡體   English   中英

數據流中的SSIS變量任務使用不正確

[英]SSIS Variable in Data Flow Task used incorrectly

在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
...

截圖

程序代碼

我不認為以下錯誤是真正的問題。

')'附近的語法不正確。

查詢解析器無法解析查詢,因為您在問號前添加了減號? 在這個答案中,我將嘗試澄清您所看到的錯誤的主要原因。

參數數據類型與可變數據類型

基於官方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)使用表達式

您可以在構建SQL命令時使用表達式:

  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 Source中從變量中選擇SQL Command並選擇@[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 

並且查詢已成功解析

在此輸入圖像描述

而不是-? 使用以下邏輯:

-1 * (CAST(? as int))

如果您只想將變量作為參數傳遞而沒有負號,那么只需使用:

(CAST(? as int))

您不能為參數指定負號,因為它會導致一些沖突,因為查詢解析器將無法定義參數數據類型。

如果仍然拋出異常,請檢查以下鏈接是否包含變通方法:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM