首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有输出子句的Server大容量插入

问带有输出子句的Server大容量插入
EN

Stack Overflow用户
提问于 2015-06-30 16:52:19
回答 2查看 2.9K关注 0票数 4

我正在做一个宠物项目,它将允许我将我的游戏集合存储在DB中,并在这些游戏上写笔记。游戏的单个条目是通过将所需的变量插入到我的game_information表中并从该表中输出新创建的行的PK (identity)来编码的,这样我就可以将它与注释一起插入到我的game_notes表中。

代码语言:javascript
复制
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来输出新创建的行的所有PKs,这样我就可以将它们与一个名为notes的变量一起插入到我的第二个表(game_notes)中。

目前,我有以下几点:

  • 存储过程,它读取.csv并使用BULK INSERT将信息转储到game_information视图中。 @FileName nvarchar(200)作为BEGIN声明@sql nvarchar(最大);SET @sql =‘散装’插入myview从‘mycsv.csv’与( FIELDTERMINATOR = '','',ROWTERMINATOR =‘\n’,FIRSTROW =2 )‘EXEC(@sql)结束

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

代码语言:javascript
复制
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中是不可行的,那么这样的东西是否是一个有效的解决方案呢?

代码语言:javascript
复制
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,但我不确定这是否允许我尝试完成的任务。对此的反馈是非常感谢的。

EN

回答 2

Stack Overflow用户

发布于 2015-07-01 16:08:58

谢谢你的输入子宫。通过修改我的BULK INSERT,我得到了如下所需的结果:

代码语言:javascript
复制
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    

这将正确的ids放置到game_notes中,并将表的Note列保留为这些条目的Null。也就是说我可以运行一个简单的

代码语言:javascript
复制
"UPDATE game_notes SET Notes = @0 WHERE Notes IS NULL";

将所需的注释推入正确的行。我在同一个If (IsPost)中执行这个和存储的大容量过程,所以我觉得自己受到了保护,避免了错误的意外便条更新。

票数 2
EN

Stack Overflow用户

发布于 2015-06-30 17:09:15

你有几个不同的选择。

  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表进行批量插入,然后使用不同的CSV文件对辅助表执行第二次大容量插入。确保重新启用键约束,并在IDENTITY_INSERT完成后将其关闭。

如果您需要对您从CSV文件中选择的数据进行更特殊的控制,那么您可以使用OPENROWSET,但是在您的帖子中没有足够的细节可供进一步评论。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31144012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档