簡體   English   中英

帶OUTPUT子句的SQL Server BULK INSERT

[英]SQL Server BULK INSERT with OUTPUT clause

我正在開發一個寵物項目,該項目使我可以將自己的游戲收藏存儲在數據庫中並為這些游戲寫筆記。 通過將所需的變量插入到我的game_information表中並從該表中輸出新創建的行的PK(標識),已經對游戲的單個條目進行了編碼,因此我可以將其與筆記一起插入到我的game_notes表中。

var id = db.QueryValue("INSERT INTO Game_Information (gamePrice, name, edition) output Inserted.gameId VALUES (@0, @1, @2)", gamePrice, name, edition); 
db.Execute("INSERT INTO Game_Notes(gameId, notes, noteDate) VALUES (@0, @1, @2)", id, notes, noteDate);

我現在正在通過csv批量上傳數據,但是我該如何編寫一個BULK INSERT來輸出新創建的行的所有PK,因此我可以將它們與第二個表( game_notes )以及一個稱為notes的變量一起插入?

目前,我有以下內容:

  • 讀取.csv並使用批量BULK INSERT將信息轉儲到game_information視圖中的存儲過程

     @FileName nvarchar(200) AS BEGIN DECLARE @sql nvarchar(MAX); SET @sql = 'BULK INSERT myview FROM ''mycsv.csv'' WITH ( FIELDTERMINATOR = '','', ROWTERMINATOR = ''\\n'', FIRSTROW = 2 )' EXEC(@sql) END 

在WebMatrix中創建設置的C#代碼

if ((IsPost) && (Request.Files[0].FileName!=" "))
{
                var fileSavePath = "";
                var uploadedFile = Request.Files[0];
                fileName = Path.GetFileName(uploadedFile.FileName);

                uploadedFile.SaveAs(//path +filename); 
                var command = "EXEC Procedure1 @FileName = @0"; 
                db.Execute(command, //path +filename); 
                File.Delete(//path +filename); 
}

允許將csv記錄插入game_information

如果使用BULK INSERT可行,那么是否有可能是嘗試的有效解決方案?

BULK INSERT into a temp_table

INSERT from temp_table to my game_information table
OUTPUT the game_Ids from the INSERT as an array(?)

then INSERT the Ids along with note into game_notes. 

我也一直在關注OPENROWSET但不確定是否OPENROWSET我的要求。 對此表示感謝。

您有幾種選擇。

  1. 批量插入臨時表,然后將信息復制到永久表中絕對是有效的解決方案。 但是,根據您要執行的操作,我看不到需要臨時表。 只需批量導入game_information中,選擇您的ID至您的應用程序,然后更新game_notes。

  2. 另一種選擇是插入您的密鑰。 您可以允許IDENTITY_INSERT在您的表上啟用,而僅將密鑰作為CSV文件的一部分。 參見此處: https : //msdn.microsoft.com/zh-cn/library/ms188059.aspx?f=255&MSPPError=-2147217396 如果這樣做,則可以對Game_information表進行批量插入,然后通過使用其他CSV文件對輔助表進行第二次批量插入。 確保重新啟用鍵約束,並在完成后關閉IDENTITY_INSERT。

如果您需要對從CSV文件中選擇的數據進行更具體的控制,則可以使用OPENROWSET,但是您的帖子中沒有足夠的詳細信息可以進一步評論。

多謝您的協助。 我可以通過如下修改BULK INSERT來獲得所需的結果:

BEGIN

DECLARE @sql nvarchar(MAX);
SET @sql=   
'CREATE TABLE #Temp (--define table--)

 BULK INSERT #Temp   --Bulk into my temp table--
 FROM '+char(39)+@FileName+char(39)+' 
 WITH
(
  FIELDTERMINATOR = '','',
  ROWTERMINATOR = ''\n'',
  FIRSTROW = 2

)

    INSERT myDB.dbo.game_information(gamePrice, name, edition, date)
    OUTPUT INSERTED.gameId, INSERTED.Date INTO myDB.dbo.game_notes(gameId, noteDate)
    SELECT gamePrice, name, edition, date
    FROM #Temp'

EXEC(@sql)
END    

game_notes正確的ID放入game_notes並將這些條目的表的Note列留為Null 這意味着我可以運行一個簡單的

"UPDATE game_notes SET Notes = @0 WHERE Notes IS NULL";

將所需的音符推入正確的行。 我正在同一If (IsPost)執行此操作,並執行了存儲的批量過程,所以我感覺自己可以防止錯誤的意外注釋更新。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM