0

我正在开发一个拒绝已加载文件并仅将新文件加载到表中的 SSIS 包。我用于每个循环并执行 SSQL 来验证文件是否已加载。当我评估 Execute SQL Task 的表达式时,它的评估结果很好。但是当我运行包时,我收到以下错误。

[执行 SQL 任务] 错误:执行查询“DECLARE @FileName VARCHAR(100) SET @FileName=Custo...”失败,出现以下错误:“'' 附近的语法不正确。”。可能的失败原因:查询有问题,“ResultSet”属性设置不正确,参数设置不正确,或连接未正确建立。

我在执行 SQL 任务中使用的表达式是:

"DECLARE @FileName VARCHAR(100) SET @FileName="+@[User::FileName]+"' IF EXISTS (SELECT 1 FROM [dbo].[FileLoadStatus] WHERE filename =@FileName) BEGIN SELECT 1 AS FileExistsFlg END ELSE BEGIN 选择 0 作为 FileExistsFlg END"

执行 SQL 任务的屏幕截图

如果你能说出问题出在哪里,我真的很感激?

4

1 回答 1

0

您可以稍微简化一下表达式,以明确使用 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 中声明的变量... 参数映射

这更不容易出错,更清晰且可重复使用,因为它生成了一个准备好的语句。

如果您的连接类型是 ADO.Net,则映射是基于名称的。因此,请查看文档以了解每种连接类型的参数名称和标记

于 2020-10-25T07:21:10.927 回答