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

青春微笑29

青春微笑29

2016-02-19 10:26

下面这个Sqlserver 2005使用XML一次更新多条记录的方法教程由图老师小编精心推荐选出,过程简单易学超容易上手,喜欢就要赶紧get起来哦!
我想很多人都知道,在oracle里面,存储过程里面可以传入数组(如int[]),也就是说,可以传多条记录到数据,从而一起更新。减少数据库的请求次数。
但SqlServer呢?bulk Insert这个很多人都知道,我也知道,但可惜,我从来没用过,只有导数据的时候才会考虑,但导数据DTS不是更方便吗?
手头的一个项目,有几个功能,每次需要更新N(N1000)条记录,记录不多,但如果每次只更新一条,循环insert,那每个功能需要N次请求数据库,如果有1000个并发,那数据库除了做你这个事情,其他的活不用干了。所以,需要尽量减少数据库请求,做到一次更新所有的记录。
幸好,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,'ChapterId268/IdName第268章/NamePrice100/Price/ChapterChapterId273/IdName第273章/NamePrice100/Price/ChapterChapterId275/IdName第275章/NamePrice100/Price/Chapter'

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


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

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


生成XML格式的函数
代码如下:

public static string FormatXmlInfo(ListChapterInfo list)
{
if (list==null||list.Count=0)
{
return String.Empty;
}
StringBuilder sb = new StringBuilder();
foreach (ChapterInfo info in list)
{
sb.AppendFormat("ChapterId{0}/IdName{1}/NamePrice{2}/Price/Chapter", info.ChapterId, info.ChapterName, info.Price);
}
return sb.ToString();
}



好了,完成了。

性能具体怎么样,还没进行测试,但肯定的一点是,比多次请求数据库,或者在存储过程里面循环分割字符串效率要高。
展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
Sqlserver 2005使用XML一次更新多条记录的方法

ASP中一次更新DATAGRID中所有记录

电脑网络
ASP中一次更新DATAGRID中所有记录

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

sqlserver2005 xml字段的读写操作

编程语言 网络编程
sqlserver2005 xml字段的读写操作

用Sql server一次插入多条数据

SQLServer
用Sql server一次插入多条数据

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

SQLServer2005 XML数据操作代码

编程语言 网络编程
SQLServer2005 XML数据操作代码

QQ群排名多久更新一次?

电脑入门
QQ群排名多久更新一次?

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Ajax开始准备入门篇

Ajax开始准备入门篇

只是需要一个肩膀 - QQ情侣分组

只是需要一个肩膀 - QQ情侣分组
下拉加载更多内容 ↓