如何编写SQL过程从列表中一次插入多个项目?

时间:2013-07-01 12:44:58

标签: c# sql-server linq stored-procedures linq-to-sql

我正在使用Linq-to-SQL,为了生成我的linq代码,我编写了一个存储过程并将该proc删除到我的dbml上。

我有很多客户名字和名单。年龄,我想写一个允许在一次调用中插入整个列表的查询?这可能吗?

目前我使用foreach循环一次插入一个,这需要很长时间才能插入数千个客户。我研究了这个,但没有得到确切的解决方案。

我是Linq-to-SQL和存储过程的新手,所以任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:2)

Linq不是完成此任务的最佳方法。对于大量插入,我建议使用Bulk Insert:

http://msdn.microsoft.com/en-us/library/ms188365.aspx

答案 1 :(得分:0)

您可以将列表作为XML项传递,并使用SQL连接从中解析出数据。

// Sample XML format
<customers>
     <customer>
         <name></name>
         <age></age> 
     </customer>
</customers>

您可以轻松地使用XElement对象(System.Xml.Linq命名空间)。

您希望存储过程接受一个参数:数据类型为xml - 然后根据与其关联的节点的值(http://msdn.microsoft.com/en-us/library/ms188282.aspx

执行插入操作
DECLARE @item xml;
SET @item = 
N'<customers>
  <customer><name>Lorcan</name><age>24</age></customer>
  <customer><name>Robert</name><age>20</age></customer>
</customers>';

INSERT INTO YOUR_TABLE_NAME
SELECT 
T.c.query('name').value('.','varchar(max)') as Name,
T.c.query('age').value('.','int') as Age
FROM @item.nodes('/customers/customer') T(c)

请注意,据我所知,目前仍有一千个插入限制。