我正在为现有的ASP.NET项目添加功能。代码调用存储过程以向特定表添加行。我还需要允许其中一列具有多个值的选项,在这种情况下,将为该列中的每个值添加一行。
我知道我可以为每一行调用一次插入方法,但这听起来非常低效。我知道我可以编写多行,由分号分隔,并在一个请求中将它们发送到数据库。但是现有代码调用存储过程,因此多个insert语句需要我修改现有代码的内容。
请注意,多个值将在文本框中存储为多行,每个值一行,并且显然必须检查是否正确输入。
有没有更简单的方法来解决这个问题?
答案 0 :(得分:2)
SQL Server 2008具有“表类型”参数,允许多行作为参数。一个例子在this SO question
中定义SQL Server 2005+具有良好的XML处理能力。我们目前将其用于小型数据集。 SQL Server 2000 XML处理不太好。
对于所有版本,您可以创建临时表,然后调用使用此表的存储过程。您可以使用SQLBulkCopy加载表。适用于许多行。
一般来说,这个问题很常见。 Erland Sommarskog有一篇文章“Arrays and Lists in SQL Server 2005 and Beyond”,这是关于这个主题的权威文章(其中一篇)(他有更多)。
要点:
答案 1 :(得分:0)
这样的事情:
INSERT INTO MyTable (FirstCol, SecondCol)
SELECT 'First' ,1
UNION ALL
SELECT 'Second' ,2
UNION ALL
SELECT 'Third' ,3
UNION ALL
SELECT 'Fourth' ,4
UNION ALL
SELECT 'Fifth' ,5
here被盗。
如果您使用的是SQL Server 2008,则可以使用此方法:
INSERT INTO MyTable (FirstCol, SecondCol)
VALUES('First' ,1)
VALUES('Second' ,2)
VALUES('Third' ,3)
VALUES('Fourth' ,4)
不确定如何使用存储过程通过...
答案 2 :(得分:0)
我最后发送一个分隔的字符串作为存储过程参数之一,然后从字符串中解析出每个元素并为每个元素添加一行。
我不确定这是实现这一目标的最佳方法,但它并不需要对现有代码进行大量修改,看起来对我来说应该是相当有效的。
答案 3 :(得分:0)
查看SqlBulkCopy,它将允许您将Datatable直接传递到数据库。