Home  >  Article  >  Database  >  Sqlserver 2005使用XML一次更新多条记录的方法

Sqlserver 2005使用XML一次更新多条记录的方法

WBOY
WBOYOriginal
2016-06-07 18:05:101059browse

Sqlserver 2005使用XML一次更新多条记录的方法,需要一次更新多条记录的朋友可以参考下。

我想很多人都知道,在oracle里面,存储过程里面可以传入数组(如int[]),也就是说,可以传多条记录到数据,从而一起更新。减少数据库的请求次数。
但SqlServer呢?bulk Insert这个很多人都知道,我也知道,但可惜,我从来没用过,只有导数据的时候才会考虑,但导数据DTS不是更方便吗?
手头的一个项目,有几个功能,每次需要更新N(N幸好,SqlServer给我们提供了一个新功能,利用XML(2000好像是没有这个功能的)。
先来假定一个这样的需求:用户更新一个book,同时需要更新N个章节。
一般的思路是这样,先更新book,然后循环章节数,N次更新数据的章节表。大家可以看下这个性能。

那我们用XML试试

利用XML更新的存储过程
代码如下:
Create PROCEDURE UP_Book_Insert
(
@BookId INT,
@ChapterXml XML
)
AS
BEGIN
CREATE TABLE #table
(
ChapterId INT,
ChapterName VARCHAR(255),
Price INT
);
INSERT #table
SELECT *
FROM (
SELECT X.C.value('Id[1]', 'int') AS ChapterId,
X.C.value('Name[1]', 'varchar(255)') AS ChapterName,
X.C.value('Price[1]','int') AS Price
FROM @ChapterXml.nodes('Chapter') AS X(C) --注意:这里的X(C)命名空间是需要的
) t;
INSERT INTO tbChapter(BookId,ChapterId,ChapterName,Price)
SELECT @BookId,ChapterId,ChapterName,Price from #table;
END

其实,在存储过程里面可以把临时表去掉的。


然后我们执行下看看

执行存储过程
代码如下:
exec UP_Book_Insert 10000,'268第268章100273第273章100275第275章100'

怎么样?不错吧。只需要在存储过程里面对XML格式进行解析。


而在c#里面,XML格式可以传入DbType.String类型就可以了。

再写一个函数来生成XML格式的字符串


生成XML格式的函数
代码如下:
public static string FormatXmlInfo(List list)
{
if (list==null||list.Count{
return String.Empty;
}
StringBuilder sb = new StringBuilder();
foreach (ChapterInfo info in list)
{
sb.AppendFormat("{0}{1}{2}", info.ChapterId, info.ChapterName, info.Price);
}
return sb.ToString();
}



好了,完成了。

性能具体怎么样,还没进行测试,但肯定的一点是,比多次请求数据库,或者在存储过程里面循环分割字符串效率要高。
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn