2017-08-11 67 views
2

簡而言之,我試圖將用戶輸入,存儲在一個變量中,然後在查詢中使用該變量。帶有用戶變量的SSIS包在哪裏條款

首先,我有一個腳本任務,用一個簡單的輸入文本框和一個按鈕打開一個窗口。點擊後,文本將被放入用戶變量中,彈出消息框以顯示用戶變量中的內容。單擊消息框上的確定關閉消息框和原始窗口。這似乎工作正常。

接下來,我有一個執行SQL任務。設置如下:

一般

  • 的ResultSet =無
  • ConectionType = OLE DB
  • 連接= localhost.DB
  • SQLSourceType =直接輸入
  • 的SQLStatement = [SQL代碼顯示以下]

參數M apping

  • 變量名=用戶::的VarName
  • 方向=輸入
  • 字段類型字段= VARCHAR
  • 參數名稱= 0
  • 參數大小= 65535

結果集 - N的/ A

表達式 - N/A

[SQL CODE]

if object_id('TEST.dbo.TEST','U') is not null 
    drop table TEST.dbo.TEST; 


SELECT 
    coalesce(FSC.a, format(cast(SVY.b as int),'000')) as ab, 
    SVY.c, 
    PP.d, 
    SV1.e, 
    PP.f, 
    PP.g, 
    cast(PP.g as float) AS g, 
    SV1.h, 
    SV1.i, 
    SVY.j, 
    SVY.k, 
    format(cast(SVY.l as int), '00000') as l, 
    CAST(SVY.m AS float) AS m, 
    SVY.n, 
    SV1.o, 
    SVY.p, 

    cast(PID.q as float) as q, 
    cast(PID.r as float) as r, 
    cast(PID.s as float) as s, 
    cast(PID.t as float) as t, 

    PID.u as u, 
    PID.v as v, 

    PP.w, 

    CAL_B.x as x, 
    CAL_B.y as y, 
    CAL_B.z as z, 

    CAL_R.aa as aa, 
    CAL_R.bb as bb, 
    CAL_R.cc as cc 

into TEST.dbo.TEST 

FROM AAA.dbo.AAA PP 

INNER JOIN BBB.dbo.BBB PPC 
    ON PP.x = PPC.x 
    AND cast(PP.x as date) = cast(PPC.x as date) 

RIGHT OUTER JOIN CCC.dbo.CCC SVY 
    ON PPC.x = SVY.x 
    AND cast(PPC.x as date) = cast(SVY.x as date) 

LEFT OUTER JOIN DDD.dbo.DDD FSC 
    ON SVY.x = FSC.x 
    AND cast(SVY.x as date) = cast(FSC.x as date) 

LEFT OUTER JOIN EEE.dbo.EEE SV1 
    ON SVY.x = SV1.x 
    AND SVY.x = SV1.x 
    AND SVY.x = SV1.x 
    AND SVY.x = SV1.x 
    AND cast(SVY.x as date) = cast(SV1.x as date) 
    AND PPC.x = SV1.x 
    AND cast(PPC.x as date) = cast(SV1.x as date) 

INNER JOIN FFF.dbo.FFF RLS 
    ON SV1.x = RLS.x 
    AND SV1.x = RLS.x 
    AND cast(SV1.x as date) = cast(RLS.x as date) 
    AND SVY.x = RLS.x 
    AND SVY.x = RLS.x 
    AND SVY.x = RLS.x 
    AND cast(SVY.x as date) = cast(RLS.x as date) 

LEFT OUTER JOIN GGG.dbo.GGG PID 
    ON PP.x = PID.x 
    AND coalesce(FSC.x, format(cast(SVY.x as int),'000')) = PID.x 

LEFT OUTER JOIN HHH.dbo.HHH CAL_B 
    ON cast('20' + SUBSTRING(RLS.x,4,2) + '-' + SUBSTRING(RLS.x,6,2) + '-' + SUBSTRING(RLS.x,8,2) as date) = CAL_B.x 
    AND CAL_B.x = 1 

LEFT OUTER JOIN III.dbo.III CAL_R 
    ON cast('20' + SUBSTRING(RLS.x,4,2) + '-' + SUBSTRING(RLS.x,6,2) + '-' + SUBSTRING(RLS.x,8,2) as date) = CAL_R.x 
    AND CAL_R.x = 1 

where 
    cast(SVY.x as date) = (select cast(max(x) as date) from JJJ.dbo.JJJ) 
    and 
    PP.x is not null 
    and 
    SVY.x in (?) 

問題:我運行包。文本輸入框打開。我把我的文本,'CN05','CN06'「(沒有雙引號),我點擊確定。盒彈出顯示我的輸入。我點擊確定。工作流轉到執行SQL任務。在1秒鐘內完成任務並進行綠色檢查,沒有錯誤。我確認已經創建了TEST.dbo.TEST,但它是空的。 現在,如果我在SSMS中對最後一位[...('CN05','CN06')]中的最後一位[... SVY.x]進行硬編碼運行上述代碼,我會在大約4分鐘內拉回超過500萬條記錄。我很難理解SSIS爲什麼不起作用。那裏有任何想法?

回答

3

通常,參數化的WHERE IN條款don't play nice。他們從來不以我們認爲他們應該的方式工作。相反,您可以使用SSIS的動態SQL版本來實現同樣的目的。創建一個字符串變量來存儲較大的SQL語句與用戶輸入的連接。然後,連接執行SQL任務以使用此變量。

例如,請創建一個名爲SqlStatement的新SSIS字符串變量。在變量的屬性窗口中,通過單擊省略號打開表達式構建器窗口。使用這個表達式生成器來連接你的SQL和用戶輸入。下面的示例...

enter image description here

一定要變的EvaluateAsExpression屬性設置爲True

enter image description here

最後,變更直接輸入的執行SQL任務交給變量和選擇這個變量作爲源。

Thing.

所有集。您的執行SQL任務現在應該被連線以使用您在表達式構建器內部構建的動態SQL。祝你好運!

+0

謝謝特洛伊!奇蹟般有效。並感謝關於爲什麼我的方法不起作用的附加信息。每天瞭解有關SQL的新知識。 –

+0

很高興我能幫到你。我認爲你正在構建的工具是內部的,所以沒什麼大不了的,但是由於你正在接受用戶輸入並使用動態SQL,你可能需要做一些[SQL注入保護](https:// www .owasp.org/index.php的/ SQL_Injection_Prevention_Cheat_Sheet)。也許,過濾掉和'''字符或';'字符。 –