簡體   English   中英

SSIS執行SQL任務編輯器查詢無法解析

[英]SSIS Execute SQL Task Editor query failed to parse

我在“執行SQL任務編輯器”中具有以下腳本。 我有兩個映射到問號的參數。 當我將@ClientCode和@PEK設置為其他值時,查詢將解析。 為什么我的查詢不解析? 參數? 完整錯誤為“查詢解析失敗。語法錯誤,權限沖突或其他非特定錯誤”

declare @ClientCode varchar(100)
declare @PEK int
set @ClientCode = ?
set @PEK = ?


if((@ClientCode != '') and (@ClientCode is not null))
begin
    exec        portal.GetClients @ClientCode
end

else if((@PEK != 0) and (@PEK != '' ))
begin

    select      distinct c.Id, c.Name, c.Code
    from        Features.map.ProfileAreasManagementAreas pama INNER JOIN
                ClientDW.dbo.ManagementAreas ma ON pama.ManagementAreaKey = ma.ManagementAreaKey INNER JOIN
                ClientDW.dbo.Clients c ON ma.ClientKey = c.ClientKey
    where       pama.PublishEventKey = @PEK
end

else 
begin  
    select      top 1 PublishEventKey
    from        Features.publish.PublishEvents
    order by    PublishDate  desc

end 

參數映射的圖像

必須對配置的方式或對代碼進行過清理的方式有所了解。

我構建了一個復制包,並對其進行了配置

在此處輸入圖片說明

無論我指定-1長度還是100和0(因為varchar(100)和int可能會這樣),參數都沒有區別。

在此處輸入圖片說明

運行成功

在此處輸入圖片說明

我使用的SQL簡化為

declare @ClientCode varchar(100)
declare @PEK int
set @ClientCode = ?
set @PEK = ?

我發現將問題精簡到本質是有幫助的。 如果此邏輯和參數分配有效,則TSQL的其余部分有問題。

既然一切正常,然后我將您的TSQL修改為

declare @ClientCode varchar(100)
declare @PEK int
set @ClientCode = ?
set @PEK = ?


if((@ClientCode != '') and (@ClientCode is not null))
begin
    PRINT @ClientCode;
end
else if((@PEK != 0) and (@PEK != '' ))
begin
    PRINT @PEK;
end
else 
begin  
    PRINT CURRENT_TIMESTAMP;
end 

我用''和0測試了當前日期和時間。 然后,我給PEK一個非零值,它回顯了非零值。 最后,我為客戶代碼提供了一個非空字符串,並且也顯示了該字符串,因此邏輯似乎都井井有條。

BIML

我使用以下Biml生成了原型包。 您可以使用免費工具BIDSHelperBiml Express來獲取Biml文件並制作SSIS軟件包-這非常酷。

安裝任何一種工具后,右鍵單擊SSIS項目,然后選擇“添加新Biml文件”。 將以下代碼復制並粘貼到BimlScript.biml文件中。

編輯第三行(OleDbConnection),將ConnectionStringDataSource指向您所在世界中的有效數據庫服務器。

救。

右鍵單擊BimlScript.biml文件,然后選擇“生成SSIS包”。

魔術,您現在擁有了一個可行的復制品。 嘗試使用它修補您的作品並進行測試。

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Connections>
        <OleDbConnection Name="tempdb" ConnectionString="Data Source=localhost\dev2014;Initial Catalog=tempdb;Provider=SQLNCLI11.0;Integrated Security=SSPI;"/>
    </Connections>
    <Packages>
        <Package Name="so_37932933">
            <Variables>
                <Variable DataType="Int32" Name="PublishEventKey">0</Variable>
                <Variable DataType="String" Name="ClientCode">mixed</Variable>
            </Variables>
            <Tasks>
                <ExecuteSQL ConnectionName="tempdb" Name="SQL Parameter test">
                    <DirectInput><![CDATA[declare @ClientCode varchar(100)
declare @PEK int
set @ClientCode = ?
set @PEK = ?]]></DirectInput>
                    <Parameters>
                        <Parameter DataType="AnsiString" VariableName="User.ClientCode" Name="0" Length="100" />
                        <Parameter DataType="Int32" VariableName="User.PublishEventKey" Name="1" />
                    </Parameters>
                </ExecuteSQL>
            </Tasks>
        </Package>
    </Packages>
</Biml>

我看到的解決方案如下。 當我測試真實數字時,我嘗試使用@ClientCode的空字符串,並且繞過了exec門戶.GetClients存儲了proc。 事實證明,我對此沒有執行要求。 其次,將BypassPrepare設置為false,並且由於某些原因? 查詢中的參數不准備添加參數的查詢。 因此,當我再次將BypassPrepare設置為true時,不必擔心解析查詢並只執行了工作正常的任務(對查詢具有新的執行權限)。 謝謝那些試圖回答它的人。 我認為這是正確的解決方案。

暫無
暫無

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

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