SSIS执行SQL任务编辑器查询无法解析

时间:2016-06-20 22:38:12

标签: sql ssis

我在执行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 

image of Parameter Mapping

2 个答案:

答案 0 :(得分:3)

对于如何配置内容或已对代码进行了清理,必定会出现问题。

我构建了一个复制包,并将其配置为

enter image description here

参数没有区别我是指定-1长度还是100和0,正如人们对varchar(100)和int所期望的那样。

enter image description here

成功运行

enter image description here

我使用的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项目并选择Add new Biml file。将以下代码复制并粘贴到BimlScript.biml文件中。

编辑第三行(OleDbConnection),将ConnectionString的{​​{1}}指向您所在世界的有效数据库服务器。

保存。

右键单击BimlScript.biml文件,然后选择Generate SSIS Packages。

魔术,你现在有了一个有效的复制品。尝试使用它来修补你的作品并对其进行测试。

DataSource

答案 1 :(得分:1)

我看到的解决方案如下。 当我测试真实数字时,我为@ClientCode尝试空字符串,它绕过了exec portal.GetClients存储过程。事实证明我没有执行此事件。 其次,BypassPrepare设置为false,出于某种原因何时?参数在查询中没有准备带有参数的查询。因此,当我再次将BypassPrepare设置为true并且不担心解析查询并且刚刚执行了它的工作(对查询具有新的执行权限)。感谢那些试图回答它的人。我认为这是正确的解决方案。