【问题标题】:How do I pass system variable value to the SQL statement in Execute SQL task?如何将系统变量值传递给执行 SQL 任务中的 SQL 语句?
【发布时间】:2012-04-18 20:04:15
【问题描述】:

SSIS 2008。非常简单的任务。我想检索一个系统变量并在 SQL INSERT 中使用它。我想检索System:MachineName 的值并在插入语句中使用它。

使用语句INSERT INTO MYLOG (COL1) SELECT @[System::MachineName] 会出现错误Error: ..failed to parse. Must declare the scalar variable "@"

使用语句SELECT @System::MachineNameSELECT @@[System::MachineName] 给出错误'Error Incorrect systax near '::'

我不想将参数传递给查询。我已经搜索了一天,但找不到如何做这件简单的事情!

【问题讨论】:

    标签: variables ssis


    【解决方案1】:

    这是您可以做到这一点的一种方法。以下示例包是使用 SSIS 2008 R2 创建的,并使用 SQL Server 2008 R2 作为后端。

    • 在您的 SQLServer 数据库中创建一个名为 dbo.PackageData 的示例表

    • 创建一个 SSIS 包。
    • 在 SSIS 上,添加一个名为 SQLServer 的 OLE DB 连接管理器以连接到您的数据库,例如 SQL Server 数据库。
    • 在“控制流”选项卡上,拖放Execute SQL Task
    • 双击执行 SQL 任务以打开执行 SQL 任务编辑器。
    • 在编辑器的General 选项卡上,将Connection 属性设置为名为SQLServer 的连接管理器。
    • 在属性SQLStatement中,输入插入语句INSERT INTO dbo.PackageData (PackageName) VALUES (?)

    • 在“参数映射”选项卡上,单击“添加”按钮,选择您要使用的包变量。相应地更改数据类型。此示例将 PackageName 插入到表中,因此 Data Type 将是 VARCHAR。将Parameter名称设置为0,表示参数的索引值。点击确定按钮。

    • 执行包。
    • 您会注意到表格中插入了一条新记录。我将包名称保留为 Package。这就是桌子的原因

    希望对您有所帮助。

    【讨论】:

    • 完美的答案,而且非常漂亮。我以前尝试过这个过程,但它从来没有奏效。我的“错误”是将“BypassPrepare”设置为 False,然后使用“Parse Query”,它总是返回错误消息。将“绕过准备”设置为 True 是神奇的秘诀。我怀疑这很简单,而且没有很好的记录。非常感谢西瓦!给你 4 颗星和一张笑脸。
    • 我刚刚了解了“问号”的含义,现在这很有意义。感谢您提供这个彻底的解决方案。另外,您的图像已损坏,因此我将其删除。随意重新添加它们。
    【解决方案2】:

    根据我对@ZERO 答案的评论(在此重复作为答案,以免被 SSIS 新人忽视)。

    OP 的问题几乎是 SSIS 属性表达式的用例。

    要将 SSIS 变量传递到查询字符串中,可以将其连接到 SqlStatementSource 属性的表达式集:

    "INSERT INTO MYLOG (COL1) SELECT " + @[System::MachineName]

    这并不是说接受的答案不是一个好的模式,因为一般来说,参数化方法比直接查询字符串操作更安全(防止 SQL 注入)和更快(重用)。但是对于系统变量(而不是用户输入的字符串),这个解决方案应该不会受到 SQL 注入的影响,并且如果重新使用(因为机器名称没有改变),这将与参数化查询大致相同或更快)。

    【讨论】:

      【解决方案3】:

      我以前从未使用过它,但也许您可以查看在执行 SQL 任务中使用表达式。

      或者只是将整个查询放入一个变量的表达式中,并将 evaluateAsExpression 设置为 true。然后用OLE DB来做你插入

      【讨论】:

      • +1 这是正确的答案恕我直言。 OP 的问题几乎是 SSIS 属性表达式的用例。要将 SSIS 变量传递到查询字符串中,可以将其连接到 SqlStatementSource 属性的表达式集; "INSERT INTO MYLOG (COL1) SELECT " + @[System::MachineName]。这并不是说接受的答案不是一个好的模式。
      【解决方案4】:

      连同@user756519 的回答,根据您的连接字符串、变量名称和 SQLStatementSource 更改

      【讨论】:

        猜你喜欢
        • 2023-03-25
        • 2014-08-22
        • 1970-01-01
        • 2015-08-08
        • 1970-01-01
        • 1970-01-01
        • 2015-11-09
        • 2021-09-28
        • 1970-01-01
        相关资源
        最近更新 更多