【问题标题】:How to pass variable as a parameter in Execute SQL Task SSIS?如何在执行 SQL 任务 SSIS 中将变量作为参数传递?
【发布时间】:2011-11-28 10:58:32
【问题描述】:

我有 ssis 包,我从平面文件中获取值并将其插入到表中。

我在创建一个临时表时执行了一个执行 SQL 任务

CREATE TABLE [tempdb].dbo.##temptable 
(
date datetime,
companyname nvarchar(50),
price decimal(10,0),
PortfolioId int,
stype nvarchar(50)
)

Insert into [tempdb].dbo.##temptable (date,companyname,price,PortfolioId,stype) 
SELECT   date,companyname,price,PortfolioId,stype
FROM        ProgressNAV
WHERE     (Date = '2011-09-30') AND (PortfolioId = 5) AND (stype in ('Index'))
ORDER BY CompanyName

现在在上面的查询中我需要传递(Date = '2011-09-30') AND (PortfolioId = 5) AND (stype in ('Index')) 这 3 个参数使用变量名我在包中创建了变量,以便我变得动态。

【问题讨论】:

    标签: sql ssis


    【解决方案1】:

    在你的 Execute SQL Task 中,确保 SQLSourceType 设置为 Direct Input,那么你的 SQL Statement 就是存储过程的名称,过程的每个参数都带有问号,如下所示:

    单击左列中的参数映射并从存储的过程中添加每个参数并将其映射到您的 SSIS 变量:

    现在,当此任务运行时,它会将 SSIS 变量传递给存储过程。

    【讨论】:

    • 谢谢.. 我直接将上面的查询写入'SQLStatement' 并在 where 子句中使用 where Date = @[User::Date]
    • 是的,我也没有使用SP,而是使用查询本身,如何将参数传递给它?
    • 我知道这是旧答案,但我必须问。 ;p 您在连接类型中使用OLE DB,但您使用@something 作为参数名称。它真的有效吗?如果是这样 - 为什么?这里:msdn.microsoft.com/en-us/ms140355.aspx 我可以读到,我应该使用 0,1,2,3.. 作为 ParameterName。
    • 我和@Monic 有同样的问题。当我按照上述操作并尝试解析 sqlstatementsource 时,我得到“查询无法解析。'?'附近的语法不正确。我错过了什么?
    • 如果您使用 ADO.NET 作为 ConnectionType,请替换 ?使用存储过程参数名称的名称。
    【解决方案2】:

    SELECTINSERTUPDATEDELETE 命令经常包含 WHERE 子句来指定过滤器,这些过滤器定义了源表中的每一行必须满足的条件才能使用 SQL 命令。参数在 WHERE 子句中提供过滤器值。

    您可以使用参数标记来动态提供参数值。可以在 SQL 语句中使用参数标记和参数名称的规则取决于 Execute SQL 使用的连接管理器的类型。

    下表按连接管理器类型列出了 SELECT 命令的示例。 INSERT、UPDATE 和 DELETE 语句类似。这些示例使用 SELECT 从 AdventureWorks2012 的 Product 表中返回 ProductID 大于和小于两个参数指定的值的产品。

    EXCEL、ODBC 和 OLEDB

    SELECT* FROM Production.Product WHERE ProductId > ? AND ProductID < ?
    

    ADO

    SELECT * FROM Production.Product WHERE ProductId > ? AND ProductID < ?
    

    ADO.NET

    SELECT* FROM Production.Product WHERE ProductId > @parmMinProductID 
         AND ProductID < @parmMaxProductID
    

    这些示例需要具有以下名称的参数: EXCEL 和 OLED DB 连接管理器使用参数名称 0 和 1。ODBC 连接类型使用 1 和 2。 ADO 连接类型可以使用任意两个参数名称,例如 Param1 和 Param2,但参数必须按照它们在参数列表中的序号位置进行映射。 ADO.NET 连接类型使用参数名称@parmMinProductID 和@parmMaxProductID。

    【讨论】:

    • 有什么想法为什么我的解析不正确?我已经根据 ado.net 进行了设置。
    • 使用带有@符号的参数名称而不是?对于 ADO.NET 连接类型。 @missscripty
    【解决方案3】:

    EXCEL 和 OLED DB 连接管理器使用参数名称 0 和 1。

    我正在使用 oledb 连接并浪费了几个小时试图找出查询不工作或获取参数的原因。上面的解释帮助很大 非常感谢。

    【讨论】:

    • 不,这是正确答案。也有同样的问题,只能使用参数名称0、1等。
    • 而 ODBC 是基于 1 的。
    • 谢谢,我一直在挠头想知道为什么直到我看到它才起作用
    【解决方案4】:

    聚会有点晚了,但这是我为插入做的:

    DECLARE @ManagerID AS Varchar (25) = 'NA'
    DECLARE @ManagerEmail AS Varchar (50) = 'NA'
    Declare @RecordCount AS int = 0
    
    SET @ManagerID = ?
    SET @ManagerEmail = ?
    SET @RecordCount = ?
    
    INSERT INTO...
    

    【讨论】:

    • 这里不需要你的set语句。你用等号设置参数
    • 我认为这个想法是DECLARE 语句将变量初始化为默认(错误)值,而SET 语句将默认值覆盖为传入的值。
    • DECLARE @variable varchar(10) SET @variable = ? -> 这是多次使用参数的方法。干净简单。
    【解决方案5】:

    连同@PaulStock 的回答,根据您的连接类型、变量名称和 SQLStatement/SQLStatementSource 更改

    https://docs.microsoft.com/en-us/sql/integration-services/control-flow/execute-sql-task

    【讨论】:

      猜你喜欢
      • 2016-02-18
      • 1970-01-01
      • 2015-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      相关资源
      最近更新 更多