我有一個 SSIS 包,它運行查詢并將值插入到不同的表中。每次包運行時,我都想為該運行的結果創建一個唯一的 RunID。這是我表中的列。我已經嘗試使用 Execute SQL Task 并設定 User::RunID 變數,但是,我相信我做錯了什么。任何人都可以提供有關如何執行此操作的分步說明嗎?
uj5u.com熱心網友回復:
為此,您需要 2 張桌子。
create table runs(
runID int identity primary key,
runDateTime datetime default getdate()
)
create table runReturns(
runReturnsID int identity primary key,
runID int not null,
[the rest of the data set]
)
在 ssis 中,從執行 SQL 開始。
添加此查詢...
insert into runs (runDateTime) values(?);
select SCOPE_IDENTITY()
將引數 (?) 映射到 Now();
將結果集更改為單行并將第一列映射到名為 runID 的引數。
現在創建一個資料流。
將您的查詢插入到 sql 源中。
添加派生列并將新列映射到 runID。
最后,將目的地添加到您的表格并相應地映射。
uj5u.com熱心網友回復:
由于根本沒有任何轉換,因此添加了一個完全 sql 答案來恭維作為替代方案:
同樣的2張桌子:
create table runs(
runID int identity primary key,
runDateTime datetime default getdate()
)
create table runReturns(
runReturnsID int identity primary key,
runID int not null,
[the rest of the data set]
)
創建作業。
添加一個步驟并將其基于 SQL。
declare @runID int;
insert into runs(runDateTime) values(getdate());
select @runID = scope_idenity();
insert into runReturns(
runID, [rest of your columns])
select @runID
, [rest of your columns]
from [rest of your query]
uj5u.com熱心網友回復:
一種可能解決該問題的方法是系統范圍的變數 ServerExecutionID
默認情況下,系統范圍的變數隱藏在“變數”選單中,但您可以通過單擊“網格選項”按鈕(5 個中的最右側)來顯示它們。
如果您使用適當的占位符(對于 OLE/ODBC 或對于 ADO 的命名引數)參考該變數并映射到該變數,那么每個服務器執行都會有一個單調遞增的數字與之關聯。從 Visual Studio 或 SSISDB 外部運行,將始終具有與它們關聯的值 0,但鑒于這僅在開發期間遇到,這可能會解決問題。
基于較新圖片的示例查詢
INSERT INTO dbo.RunMapTable
SELECT ? AS RunID
, D.Name
FROM
(
VALUES ('A')
, ('B')
, ('C')
, ('D')
)D([name];
引數映射
0 -> System::ServerExecutionID
作為額外的獎勵,您可以將自定義日志記錄系結回 SSISDB 中的本機日志記錄。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/472114.html
上一篇:在單個回圈內的兩個陣列之間迭代
下一篇:從另一個變數中提取變數中的值