提问人:John Saunders 提问时间:1/14/2015 更新时间:1/15/2015 访问量:8987
如何将 T-SQL 语句中的结果集添加到数据流?
How to Add the Result Set from a T-SQL Statement to a Data Flow?
问:
我有一个简单的 SSIS 包,我想让它复杂一点。
现在,它在 OLE DB 源中执行存储过程,并将从存储过程返回的行添加到数据流中。然后,对于返回的每一行,它执行 OLE DB 命令转换,执行第二个存储过程(在第二个数据库中),将源中的列作为参数传递。
第二个存储过程执行同步功能,我想记录添加、删除和更新的总和数量。“sync”存储过程使用 MERGE 语句的 OUTPUT 子句来获取此数据并将其作为结果集返回。
我看不出有办法从 OLE DB 命令转换中获取此结果集。它不允许我添加输出列。
除了添加脚本转换之外,有没有办法记录添加、删除和更新列的总计?
答:
2赞
billinkc
1/15/2015
#1
这并不像它应该的那样简单。否则我需要回到SSIS类。
OLE DB 命令组件无法向数据流添加新行,因为它是同步组件。
它也无法向数据流添加新列。这是第一件事,不直观。因此,您将在我的源代码中看到,我添加了一个 nvarchar(10)/字符串长度为 10 的 ActionName 列。如果您愿意,可以在 OLE DB 命令组件之前的派生列转换中添加该列。
由于我无法向数据流添加行,这意味着我只能对过程使用 OUTPUT 参数,而不能使用它可以生成的记录集。也许您的存储过程一次只允许更改一行,这没关系,但对我来说有一种通用的代码味道。
表定义和设置
CREATE TABLE dbo.so_27932430
(
SourceId int NOT NULL
, SourceValue varchar(20) NOT NULL
);
GO
INSERT INTO
dbo.so_27932430
(SourceId, SourceValue)
VALUES
(1, 'No change')
, (3,'Changed');
存储过程
CREATE PROCEDURE
dbo.merge_27932430
(
@SourceId int
, @SourceValue varchar(20)
, @ActionName nvarchar(10) OUTPUT
)
AS
BEGIN
SET NOCOUNT ON;
DECLARE
@BloodyHack table
(
ActionName nvarchar(10) NOT NULL
, SourceId int NOT NULL
);
MERGE
dbo.so_27932430 AS T
USING
(
SELECT
D.SourceId
, D.SourceValue
FROM
(
SELECT @SourceId, @SourceValue
) D(SourceId, SourceValue)
) AS S
ON
(
T.SourceId = S.SourceId
)
WHEN
MATCHED
AND T.SourceValue <> S.SourceValue
THEN
UPDATE
SET
T.SourceValue = S.SourceValue
WHEN
NOT MATCHED THEN
INSERT
(
SourceId
, SourceValue
)
VALUES
(
SourceId
, SourceValue
)
OUTPUT
$action, S.SourceId
INTO
@BloodyHack;
/* Pick one, any one*/
SELECT
@ActionName = BH.ActionName
FROM
@BloodyHack AS BH
END
源查询
SELECT
D.SourceId
, D.SourceValue
, CAST(NULL AS nvarchar(10)) AS ActionName
FROM
(
VALUES
(1, 'No change')
, (2, 'I am new')
, (3,'I Changed')
) D(SourceId, SourceValue);
OLE DB 命令设置
EXECUTE dbo.merge_27932430 @SourceId = ?, @SourceValue = ?, @ActionName = ? OUTPUT;
结果
引用
比姆尔
假设您有免费的 BidsHelper,则使用以下 Biml 来生成此包。
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<Connections>
<OleDbConnection Name="CM_OLE" ConnectionString="Data Source=localhost\dev2014;Initial Catalog=tempdb;Provider=SQLNCLI10.1;Integrated Security=SSPI;Auto Translate=False;" />
</Connections>
<Packages>
<Package ConstraintMode="Linear" Name="so_27932430">
<Variables>
<Variable DataType="String" Name="QuerySource">
<![CDATA[SELECT
D.SourceId
, D.SourceValue
, CAST(NULL AS nvarchar(10)) AS ActionName
FROM
(
VALUES
(1, 'No change')
, (2, 'I am new')
, (3,'I Changed')
) D(SourceId, SourceValue);
]]></Variable>
<Variable DataType="String" Name="QueryCommand">EXECUTE dbo.merge_27932430 @SourceId = ?, @SourceValue = ?, @ActionName = ? OUTPUT;</Variable>
</Variables>
<Tasks>
<Dataflow Name="DFT OLEDB Test">
<Transformations>
<OleDbSource ConnectionName="CM_OLE" Name="OLESRC GenData">
<VariableInput VariableName="User.QuerySource" />
</OleDbSource>
<OleDbCommand ConnectionName="CM_OLE" Name="OLECMD Test">
<DirectInput>EXECUTE dbo.merge_27932430 @SourceId = ?, @SourceValue = ?, @ActionName = ? OUTPUT;</DirectInput>
<Parameters>
<Parameter SourceColumn="SourceId" DataType="Int32" TargetColumn="@SourceId"></Parameter>
<Parameter SourceColumn="SourceValue" DataType="AnsiString" Length="20" TargetColumn="@SourceValue"></Parameter>
<Parameter SourceColumn="ActionName" DataType="String" Length="10" TargetColumn="@ActionName"></Parameter>
</Parameters>
</OleDbCommand>
<DerivedColumns Name="DER PlaceHolder" />
</Transformations>
</Dataflow>
</Tasks>
</Package>
</Packages>
</Biml>
评论
0赞
John Saunders
1/15/2015
谢谢。我在这里可能会很幸运。存储过程的输出仅用于记录添加、删除和不匹配的行数。听起来它适用于三个 OUTPUT 参数。正如你所说,这并不理想。如果我真的需要返回多行(我几乎做到了),那就行不通了。
评论