问题描述
我正在研究一个SSIS软件包,该软件包拒绝已经加载的文件,并且仅将新文件加载到表中。 我用于每个循环并执行Ssql来验证文件是否已加载。当我评估 Execute sql Task的表达式,它的计算结果很好。但是当我运行打包程序时,出现以下错误。
[执行sql任务]错误:执行查询“ DECLARE @FileName VARCHAR(100) SET @ FileName = Custo ...”失败,并出现以下错误:“。附近的语法不正确。”。 可能的失败原因:查询问题,“ ResultSet”属性未正确设置, 参数设置不正确或连接建立不正确。
我在Execute sql任务中使用的表达式是:
“ DECLARE @FileName VARCHAR(100) SET @FileName =“ + @ [User :: FileName] +”' 如果存在(选择1 来自[dbo]。[FileLoadStatus] 文件名= @ FileName) 开始 选择1 AS FileExistsFlg 结束 其他 开始 选择0 AS FileExistsFlg END”
screen shot of the execute SQL Task
我真的很想知道您在哪里吗?
解决方法
您可以稍微简化一下表达式以弄清楚在何处使用了SSIS变量:
"SELECT COUNT(*) AS FileExistsFlg
FROM (
SELECT TOP(1) *
FROM
dbo.FileLoadStatus
WHERE
[filename] = '" + @[User::FileName] + "'
) x;"
另一方面,对于SQL任务,您可以使用标准的参数化查询。假设您正在使用OLEDB连接,则参数占位符是?。标志。不需要任何表达式,该任务的等效直接输入为:
SELECT COUNT(*) AS FileExistsFlg
FROM (
SELECT TOP(1) *
FROM
dbo.FileLoadStatus
WHERE
[filename] = ?
) x;
使用OLEDB,您必须按位置(从零开始)将变量映射到占位符,因此在这种情况下,“参数名称”为数字零。其他属性取决于您的元数据,并对应于您将在SQL中声明的变量。
由于它会生成一条Prepared Statement,因此它不易出错,更清晰且可重复用于多个调用。
如果您的连接类型是ADO.Net,则映射是基于名称的。因此,请查看每种连接类型的Parameter names and markers文档。