2017-03-17 145 views
1

我想在SSIS中執行參數綁定到一個變量通過在SQL任務使用swicth情況下,SQL語句:SSIS參數可變開關

SELECT @[User::StartTime]= 

CASE @[$Project::CmdParam] WHEN 'Full' THEN '20000101000100' WHEN 'Day-1' THEN (SELECT SUBSTRING(CONVERT(nvarchar(12),DATEADD("Day", -1, GETDATE()), 112),0,12)+''+'235000') WHEN 'Day-2' THEN (SELECT SUBSTRING(CONVERT(nvarchar(12),DATEADD("Day", -2, GETDATE()), 112),0,12)+''+'235000') WHEN 'Day-3' THEN (SELECT SUBSTRING(CONVERT(nvarchar(12),DATEADD("Day", -3, GETDATE()), 112),0,12)+''+'235000') ELSE @[$Project::CmdParam]+'235000' END;

我能夠在SSMS中運行查詢,但它在我的包中失敗。 它無法解析查詢。

+0

如果您使用的是SQL Task,參數的佔位符由驅動程序決定。你使用的是OLE DB還是ADO.Net? –

+0

請忽略我的(現已刪除)評論。解決這個問題的唯一方法是刪除大部分代碼,並獲得一個非常基本的示例,並開始工作。此外,請確認您的連接是否爲OLEDB或ADO.Net –

回答

2
SELECT 
CASE WHEN @[$Project::CmdParam]='Full' THEN '20000101000100' 
    WHEN @[$Project::CmdParam]='Day-1' THEN (SELECT SUBSTRING(CONVERT(nvarchar(12),DATEADD("Day", -1, GETDATE()), 112),0,12)+''+'235000') 
    WHEN @[$Project::CmdParam]='Day-2' THEN (SELECT SUBSTRING(CONVERT(nvarchar(12),DATEADD("Day", -2, GETDATE()), 112),0,12)+''+'235000') 
    WHEN @[$Project::CmdParam]='Day-3' THEN (SELECT SUBSTRING(CONVERT(nvarchar(12),DATEADD("Day", -3, GETDATE()), 112),0,12)+''+'235000') 
    ELSE @[$Project::CmdParam]+'235000' 
END 

確保在Parameter Mapping頁面匹配parameter name@[$Project::CmdParam]CASE WHEN完全相同作爲像上面。更重要的是,選擇Single Row作爲reulst,並選擇@[User::StartTime]作爲存儲變量Result

UPDATE

像尼克說,切換到ADO.NetConnection Type因爲你是使用SQL Server的工作,那麼你可以使用上面的映射方法,否則,您必須使用?,在查詢中替換每個@[$Project::CmdParam],然後Parameter Name作爲映射參數,在您的情況下,將0,1,2,3,4與結果保持相同映射。

月2日更新 如果使用ADO.net現在,忘掉0-4的事情,Execute SQL Task粘貼以下查詢到你的語句:

SELECT 
CASE WHEN @a = 'Full' THEN '20000101000100' 
    WHEN @a = 'Day-1' THEN (SELECT SUBSTRING(CONVERT(nvarchar(12),DATEADD("Day", -1, GETDATE()), 112),0,12)+''+'235000') 
    WHEN @a = 'Day-2' THEN (SELECT SUBSTRING(CONVERT(nvarchar(12),DATEADD("Day", -2, GETDATE()), 112),0,12)+''+'235000') 
    WHEN @a = 'Day-3' THEN (SELECT SUBSTRING(CONVERT(nvarchar(12),DATEADD("Day", -3, GETDATE()), 112),0,12)+''+'235000') 
    ELSE @a + '235000' 
END 

粘貼後,選擇Single Row作爲該Result set然後轉到Parameter Mapping頁面,選擇$Project::CmdParam作爲Variable Name,對於Parameter Name鍵入@a,它將在查詢中將您的包變量映射到@a。然後轉到Result Set頁面,Add新結果,Result Name應該是0,並選擇User::StartTime作爲存儲查詢結果的變量。

經過以上所有步驟,這次應該會很好。

+1

您無法直接將該值解析爲SSIS變量,而無需映射參數和存儲的結果變量 – LONG

+0

正確。在一個SQL任務中,這需要一堆'?'符號,然後他們需要被映射。不過,它在_Expression Task_中有意義。 –

+0

@ Nick.McDermaid是的,在我使用'?'來引用所有參數之前,但是在長查詢中找到每個參數的'Parameter Name'都很難,現在我更喜歡直接使用參數名稱,比如' @ parameterName',然後在'Parameter Name'中,我只需輸入該特定參數的已知名稱:) – LONG