간단한 SSIS 패키지가 있는데 좀 복잡하게 만들고 싶습니다.
지금은 OLE DB 원본에서 저장 프로 시저를 실행하고 저장 프로 시저에서 반환 된 행을 데이터 흐름에 추가합니다. 그런 다음 반환 된 각 행에 대해 OLE DB 명령 변환을 실행하여 두 번째 저장 프로 시저 (두 번째 데이터베이스에서)를 실행하고 소스의 열을 매개 변수로 전달합니다.
두 번째 저장 프로시 저는 동기화 기능을 수행하며 추가, 삭제 및 업데이트의 총 합계를 기록하고 싶습니다. "sync"저장 프로시 저는 MERGE 문의 OUTPUT 절을 사용하여이 데이터를 가져와 결과 집합으로 반환합니다.
OLE DB 명령 변환에서이 결과 집합을 가져 오는 방법이 없습니다. 출력 열을 추가 할 수 없습니다.
스크립트 변환을 추가하는 것 외에 추가, 삭제 및 업데이트 열의 총 합계를 기록 할 수있는 방법이 있습니까?
이것은 당연한 것만 큼 간단하지 않습니다. 또는 SSIS 수업으로 돌아 가야합니다.
OLE DB 명령 구성 요소는 동기 구성 요소이므로 데이터 흐름에 새 행을 추가 할 수 없습니다.
또한 데이터 흐름에 새 열을 추가 할 수 없습니다. 그것이 직관적이지 않은 첫 번째 것입니다. 소스에서 볼 수 있습니다. nvarchar (10) / 문자열 길이 10 인 ActionName 열을 추가했습니다. 원하는 경우 OLE DB 명령 구성 요소 이전에 파생 열 변환에 열을 추가 할 수 있습니다.
데이터 흐름에 행을 추가 할 수 없으므로 생성 할 수있는 레코드 집합을 사용하는 대신 내 proc에 대해 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);
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>
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다