我正在使用一个存储过程将记录插入表中。在一个循环中至少这样做12次,以插入多个记录,这是非常低效的。
这是创建的过程
Create PROC [dbo].[SP_INSERT_G_SAMPLING]
@GameID INT,
@ScoreID INT
as
begin
INSERT INTO GAMESCORE (GAMEID, SCOREID) VALUES
(@GameID, @ScoreID)
end
我传递ex(1,3)的值,并从网站上循环更多的值。
然而,我想一次性传递所有值,如(1,3)、(4,5)、(8,9)
然后改变上述过程以接收和插入多行。
ALTER PROC [dbo].[SP_INSERT_G_SAMPLING]
@totalinsert nvarchar(Max)
INSERT INTO GAMESCORE (GAMEID, SCOREID) VALUES
(@totalinsert)
@totalinsert类似于从网页推送的(1,3)、(4,5)、(8,9)。
任何帮助都将不胜感激
您要做的是编写一个表值函数,该函数接受多值字符串并将其分解为一个表对象。如果您可以将源更改为使用记录分隔符而不是逗号集,那么处理起来会稍微容易一些。一个例子是这样的。
下面的内容纯粹是psuedo,没有经过任何验证,只是想让你大致了解一下该去哪里。
例如:@TotalInsert=1,2|4,5|8,9
DECLARE @Results TABLE
(
value1 INT,
value2 INT
)
DECLARE @setlist VARCHAR(max);
WHILE Len(@TotalInsert) > 0
BEGIN
SET @setlist = LEFT(@totalinsert, Charindex('|', @totalinsert))
INSERT INTO @results
SELECT LEFT(@setlist, Charindex(',', @setlist) - 1),
RIGHT(@setlist, Charindex(',', Reverse(@setlist)) + 1)
SET @totalinsert = RIGHT(@totalinsert, Len(@totalinsert) - Len(@setlist))
END
我假设您的网站使用.NET,因为您也在使用SQL Server。
看看表值参数,这个页面还包括一个如何在.NET.中使用表值参数的好例子
请查看此处,以获得在T-SQL中使用表值参数生成存储过程的更好示例。
以下是完整的讨论:
http://www.sommarskog.se/arrays-in-sql-2005.html#XMLlist%20of%20values
就我个人而言,我将xml发送到存储过程,我将其"分解"到@variable或#temp表中,然后从那里执行INSERT/UPDATE/MERGE/DELETE。
下面是关于xml切碎的更全面的讨论。
http://pratchev.blogspot.com/2007/06/shredding-xml-in-sql-server-2005.html
我个人的诀窍是创建一个强数据集,用行填充强数据集并使用ds.GetXml()将xml向下发送到TSQL。有了强大的数据集,我在填充值时会得到强大的类型。但归根结底,数据集只是一些超级花哨的xml。