我有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
现在在上面的查询中,我需要传递(Date = '2011-09-30') AND (PortfolioId = 5) AND (stype in ('Index'))
这三个参数使用变量名称我在包中创建了变量,这样我就变得动态了。
答案 0 :(得分:86)
在执行SQL任务中,确保将SQLSourceType设置为直接输入,然后您的SQL语句是存储过程的名称,其中包含proc的每个参数的问号,如下所示:
单击左列中的参数映射并添加存储过程中的每个参数并将其映射到SSIS变量:
现在,当此任务运行时,它会将SSIS变量传递给存储过程。
答案 1 :(得分:18)
EXCEL和OLED数据库连接管理器使用参数名称0和1.
我正在使用oledb连接并浪费了几个小时试图弄清楚查询无效的原因或采用参数。上面的解释帮了很多忙 非常感谢。
答案 2 :(得分:6)
除了@ PaulStock的回答,根据您的连接类型,您的变量名称和SQLStatement / SQLStatementSource更改
https://docs.microsoft.com/en-us/sql/integration-services/control-flow/execute-sql-task
答案 3 :(得分:4)
SELECT
,INSERT
,UPDATE
和DELETE
命令经常包含WHERE子句,用于指定过滤器,这些过滤器定义源表中每行必须符合的条件才能符合条件一个SQL命令。参数提供WHERE子句中的过滤器值。
您可以使用参数标记动态提供参数值。可以在SQL语句中使用参数标记和参数名称的规则取决于执行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。
答案 4 :(得分:2)
派对有点晚了,但这就是我为插入做的方式:
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...