【问题标题】:Execute SQL Task Error: Executing the query failed with the following error: "Incorrect syntax near ''."执行 SQL 任务错误:执行查询失败,出现以下错误:“'' 附近的语法不正确。”
【发布时间】:2021-02-07 10:52:36
【问题描述】:

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

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

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

"声明@FileName VARCHAR(100) SET @FileName="+@[User::FileName]+"' 如果存在(选择 1 FROM [dbo].[FileLoadStatus] WHERE 文件名 =@FileName) 开始 选择 1 作为 FileExistsFlg 结尾 别的 开始 选择 0 AS FileExistsFlg 结束”

screen shot of the execute SQL Task

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

【问题讨论】:

  • 我看到@[User::FileName]+之后有一对逗号""...我认为应该只有一个"

标签: variables ssis expression foreach-loop-container execute-sql-task


【解决方案1】:

您可以稍微简化一下表达式以明确使用 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,则映射是基于名称的。因此,请查看每种连接类型的 Parameter names and markers 文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    相关资源
    最近更新 更多