C# SQL Server带OUTPUT子句的大容量插入

C# SQL Server带OUTPUT子句的大容量插入,c#,sql,sql-server-2008,C#,Sql,Sql Server 2008,我正在做一个宠物项目,它将允许我把我的游戏收藏储存在数据库中,并在这些游戏上写笔记。通过将所需变量插入我的game_信息表并从该表中输出新创建行的PK标识,我可以将其与注释一起插入我的game_注释表,从而对单个游戏条目进行编码 var id = db.QueryValue("INSERT INTO Game_Information (gamePrice, name, edition) output Inserted.gameId VALUES (@0, @1, @2)", gamePrice,

我正在做一个宠物项目,它将允许我把我的游戏收藏储存在数据库中,并在这些游戏上写笔记。通过将所需变量插入我的game_信息表并从该表中输出新创建行的PK标识,我可以将其与注释一起插入我的game_注释表,从而对单个游戏条目进行编码

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批量上传数据的游戏,但是如何编写一个批量插入来输出新创建行的所有PK,这样我就可以将它们与一个名为notes的变量一起插入到第二个表game_notes中

目前,我有以下几点:

读取.csv并使用大容量插入将信息转储到游戏信息视图中的存储过程

@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记录插入游戏信息中

如果批量插入无法实现这一点,那么尝试使用类似的解决方案是否有效

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,但我不确定这是否能实现我的目标。非常感谢您的反馈。

您有一些不同的选择

批量插入临时表,然后将信息复制到永久表中,这绝对是一个有效的解决方案。然而,根据你所做的,我认为没有必要建立临时表。只需批量导入game_信息,选择应用程序的ID,然后更新game_便笺

另一种选择是插入密钥。您可以允许为表启用IDENTITY_INSERT,并将密钥作为CSV文件的一部分。请参见此处:。如果您这样做了,那么您可以在Game_信息表中进行批量插入,然后使用不同的CSV文件在辅助表中进行第二次批量插入。确保重新启用关键点约束,并在完成后关闭IDENTITY_INSERT


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

感谢您的输入womp。通过修改批量插入,我获得了预期的结果,如下所示:

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_注释中,并将表中的注释列保留为空。这意味着我可以运行一个简单的

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

将所需的音符推入正确的行。我正在以相同的If-IsPost执行此过程和大容量存储过程,因此我感觉自己受到了保护,不会受到错误的便笺更新的影响。

我会尝试使用bcp.exe导出/生成您需要的csv文件,然后使用bcp进行导入。bcp.exe允许查询,因此您可以根据上次创建的ID编写要导出的查询。