我在 SQL Server 中有兩個表:
人
ID (PK, int, IDENTITY)
Name (varchar(100))
UploadedBy (varchar(50))
DateAdded (datetime)
個人檔案
ID (PK, int, IDENTITY)
PersonId (FK, int)
PersonFile (varchar(max))
我正在讀取一個大檔案 (150MB),并且我有一個腳本組件可以成功地將檔案決議為幾列。問題是我需要先將決議資料行的前 3 列插入到我的 Person 表中,然后使用該行的 ID 將最后一列插入到我的 PersonFile 表中。在 SSIS 中是否有一種簡單的方法可以做到這一點?
我想我可以在技術上撰寫所有腳本來處理資料庫中的插入,但我覺得在這種情況下,我不妨完全跳過 SSIS 和用戶 powershell。我還想過在 SQL Server 中撰寫一個程序,然后將資訊傳遞給該程序來處理插入。但同樣,這似乎非常低效。
如果其中一個表具有外鍵約束,那么將一行資料插入到兩個表中的最佳方法是什么?
uj5u.com熱心網友回復:
我認為最好的方法是在資料庫中使用一個階段表來保存決議的源檔案,然后使用存盤程序或 SQL 查詢來加載你的表。SSIS 中有一個查找組件可用于您的情況,但由于各種原因我盡量避免使用它。
創建一個類似于源檔案的表,例如:
CREATE TABLE dbo.[SourceFileName](
Name nvarchar(100) NULL,
UploadedBy nvarchar(50) NULL,
DateAdded datetime NULL,
PersonFile nvarchar(max) NULL
)
截斷舞臺表。使用資料流組件獲取源資料。使用腳本或存盤程序在目標表中插入源資料(從 Person 開始并加載 PersonFile)。您的 SSIS 資料流應如下所示:

對于人的插入腳本,請執行以下操作:
INSERT INTO dbo.Person (Name, UploadedBy,DateAdded)
SELECT Name,UploadedBy,DateAdded
FROM dbo.SourceFileName;
對于 PersonFile 的插入,連接到目標表:
INSERT INTO dbo.PersonFile(PersonId,PersonFile)
SELECT
Person.ID,
SourceFile.PersonFile
FROM dbo.SourceFileName SourceFile
JOIN dbo.Person Person
ON Person.Name = SourceFile.Name
您還應該UNIQUE CONSTRAINT在標識此人的列中添加一個(例如姓名)。
uj5u.com熱心網友回復:
一件非常常見的事情是首先暫存資料。
因此,您將所有列插入到服務器上的一個表中,該表還有一個額外的 PersonID 可以為空的列。
然后,您將有一個存盤程序,它將唯一的 Person 記錄插入到 Person 表中,并使用生成的 PersonID 更新臨時表,這是您插入 PersonFile 所需的額外欄位,然后可以在同一程序中執行或另一個。(您可以在 SSIS 中通過執行 SQL 任務呼叫這些程序。)
我想這可能完全在 SSIS 中完成,例如使用執行插入并檢索 PersonID 以進行第二次插入的腳本目標,但我相當確定使用這樣的方法會對性能造成巨大影響。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/347369.html
標籤:sql-server 视觉工作室 姐姐
上一篇:在幾年內對多列使用COUNT()
