2017-03-17 6 views
1

Ich versuche, einen Ausführungsparameter in SSIS auf eine Variable zu binden, durch eine swicth Fall SQL-Anweisung in einer SQL-Aufgabe mit:SSIS Parameter zum Variable Schalter

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;

Ich bin in der Lage, die Abfrage in SSMS auszuführen, aber es schlägt in meinem Paket fehl. Es kann die Abfrage nicht analysieren.

+0

Wenn Sie eine SQL-Aufgabe verwenden, werden die Platzhalter für Parameter vom Treiber festgelegt. Verwenden Sie OLE DB oder ADO.Net? –

+0

Bitte ignorieren Sie meinen (jetzt gelöschten) Kommentar. Die einzige Möglichkeit, um dies zu beheben, entfernen Sie den Großteil Ihres Codes und erhalten ein sehr einfaches Beispiel arbeiten und arbeiten sich nach oben. Überprüfen Sie außerdem, ob Ihre Verbindung OLEDB oder ADO.Net ist. –

Antwort

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 

die parameter name in Parameter Mapping Seite Spiel Stellen Sie sicher, genau die gleiche wie @[$Project::CmdParam] und CASE WHEN als wie oben verwendet. Wichtiger, wählen Single Row als reulst und in Result Seite

UPDATE

wie Nick sagte, Schalter auf ADO.Net als Connection Type@[User::StartTime] wie die gespeicherte Variable wählen, da Sie mit SQL Server arbeiten, können Sie dann könnte die oben genannten Mapping-Methoden verwenden, andernfalls müssen Sie ? verwenden, ersetzen Sie jede @[$Project::CmdParam] in der Abfrage, dann wird die Parameter Name für die Zuordnung Parameter sein, in Ihrem Fall 0,1,2,3,4, bleiben Sie gleich mit dem Ergebnis Kartierung.

2. UPDATE Wenn Sie ADO.net jetzt verwenden, etwa 0-4 Sache vergessen, Fügen Sie die folgende Abfrage, um Sie Anweisung in 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 

Nach dem Einfügen wählen Single Row als Result set in der gleiche Seite, nächste gehen Sie auf die Parameter Mapping Seite, wählen Sie $Project::CmdParam als Variable Name, geben Sie @a für die Parameter Name, die Ihre Paketvariable zu @a in der Abfrage zuordnen wird. Dann gehen Sie zu Result Set Seite, Add neues Ergebnis, Result Name sollte 0 sein, und wählen Sie User::StartTime als die Variable, die das Abfrageergebnis speichern.

Nach all den oben genannten Schritten, sollte diesmal in Ordnung sein.

+1

Sie können den Wert nicht direkt in SSIS-Variablen analysieren, ohne Mapping-Parameter und die gespeicherte Ergebnisvariable – LONG

+0

. In einer SQL-Aufgabe würde dies eine Menge '?' Symbole erfordern, und dann müssen sie gemappt werden. Es macht jedoch in einer _Ausdrucksaufgabe_ Sinn. –

+0

@ Nick.McDeermay Ja, bevor ich '' 'verwendet, um alle Parameter zu beziehen, aber es ist schwer zu finden' Parameter Name' für jeden Parameter in einer langen Abfrage, jetzt bevorzuge ich nur Parameter Namen direkt wie ' @ parameterName ', dann im' Parametername', ich muss nur den bekannten Namen für diesen bestimmten Parameter eingeben :) – LONG