我在执行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
答案 0 :(得分:3)
对于如何配置内容或已对代码进行了清理,必定会出现问题。
我构建了一个复制包,并将其配置为
参数没有区别我是指定-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生成原型包。您可以使用免费工具BIDSHelper或Biml 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并且不担心解析查询并且刚刚执行了它的工作(对查询具有新的执行权限)。感谢那些试图回答它的人。我认为这是正确的解决方案。