如何在变量SQL任务SSIS中将变量作为参数传递?

Neo*_*Neo 49 sql ssis

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

我在创建一个temptable时采用了一个执行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
Run Code Online (Sandbox Code Playgroud)

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

Pau*_*ock 92

在您的执行SQL任务中,确保将SQLSourceType设置为直接输入,然后您的SQL语句是存储过程的名称,其中包含proc的每个参数的问号,如下所示:

在此输入图像描述

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

在此输入图像描述

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

  • 我知道这是旧答案,但我不得不问.; p你在连接类型中使用`OLE DB`,但你使用`@ something`作为ParameterName.它真的有效吗?如果是这样 - 为什么?这里:https://msdn.microsoft.com/en-us/ms140355.aspx我可以读,我应该使用`0,1,2,3..`作为ParameterName. (9认同)
  • 如果您使用ADO.NET for ConnectionType,请替换?使用存储过程参数名称的名称. (3认同)
  • 是的,我也没有使用SP相同而是使用Query本身,如何将参数传递给它? (2认同)

小智 18

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

我正在使用oledb连接并浪费了几个小时试图弄清楚查询无效或参数的原因.上面的解释很有帮助.非常感谢.

  • 而ODBC是基于1的。 (2认同)

Sam*_*Sam 7

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

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


Tej*_* MB 5

SELECTINSERTUPDATE,和DELETE命令通常包括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 < ?
Run Code Online (Sandbox Code Playgroud)

阿多

SELECT * FROM Production.Product WHERE ProductId > ? AND ProductID < ?
Run Code Online (Sandbox Code Playgroud)

ADO.NET

SELECT* FROM Production.Product WHERE ProductId > @parmMinProductID 
     AND ProductID < @parmMaxProductID
Run Code Online (Sandbox Code Playgroud)

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


小智 5

聚会有点晚了,但这就是我插入的方式:

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...
Run Code Online (Sandbox Code Playgroud)

  • 这里不需要你的 set 语句。您用等号设置参数 (2认同)