带有OUTPUT子句的SQL Server BULK INSERT

时间:2015-06-30 16:52:20

标签: c# sql sql-server-2008

我正在开展宠物项目,这将允许我将我的游戏集合存储在数据库中并在这些游戏上写下笔记。通过将所需变量插入到我的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,所以我可以将它们插入到我的第二个表中({ {1}})以及一个名为notes的变量?

目前我有以下内容:

  • 存储过程,读取game_notes并使用.csv将信息转储到game_information视图中

    BULK INSERT

在WebMatrix中创建设置的C#代码

@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

允许将csv记录插入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); }

如果使用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. ,但我不确定这是否会影响我想要完成的事情。非常感谢对此的反馈。

2 个答案:

答案 0 :(得分:0)

您有几种不同的选择。

  1. 批量插入临时表,然后将信息复制到永久表中绝对是一种有效的解决方案。但是,根据您尝试做的事情,我不需要临时表。只需批量导入game_information,将您的ID选择到您的应用程序,然后更新game_notes。

  2. 另一种选择是插入密钥。您可以允许为您的表启用IDENTITY_INSERT,并将您的密钥作为CSV文件的一部分。见这里:https://msdn.microsoft.com/en-ca/library/ms188059.aspx?f=255&MSPPError=-2147217396。如果您这样做,那么您可以在您的Game_information表中执行BULK INSERT,然后使用不同的CSV文件对您的辅助表执行第二次BULK INSERT。请务必重新启用关键约束,并在完成后关闭IDENTITY_INSERT。

  3. 如果您需要对从CSV文件中选择的数据进行更具体的控制,那么您可以使用OPENROWSET但是您的帖子中没有足够的详细信息可以进一步评论。

答案 1 :(得分:0)

感谢您输入womp。通过修改我的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    

这会将正确的ID放入game_notes,并将表格的Note列保留为Null这些条目。这意味着我可以运行一个简单的

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

将所需的音符推入正确的行。我正在同一If (IsPost)执行此操作和存储的批量过程,因此我觉得我可以防止错误的意外更改。