仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 808|回复: 8
打印 上一主题 下一主题

[学习教程] MSSQL网页编程之给SQL Server传送数组参数的变通举措

[复制链接]
深爱那片海 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:42:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
“数据行级锁定”的意思是指在事务操作的执行过程中锁定正在被处理的个别记录,不让其他用户进行访问。这种锁定将影响到(但不限于)SELECT、LOCKINSHAREMODE、SELECT、FORUPDATE命令以及INSERT、UPDATE和DELETE命令。server|数组比来一向在做Dnn模块的开辟,过程当中碰着这么一个成绩,必要同时拔出N条数据,不想在程序里把持,可是SQLSever又不撑持数组参数.以是只能用变通的举措了.使用SQLServer壮大的字符串处置传把数组格局化为相似"1,2,3,4,5,6"。然后在存储过程当中用SubString共同CharIndex把支解开来.
具体的存储历程


CREATEPROCEDUREdbo.ProductListUpdateSpecialList
@ProductId_ArrayvarChar(800),
@ModuleIdint
AS
DECLARE@PointerPrevint
DECLARE@PointerCurrint
DECLARE@TIdint
Set@PointerPrev=1
set@PointerCurr=1

begintransaction
SetNoCountON
deletefromProductListSpecialwhereModuleId=@ModuleId

Set@PointerCurr=CharIndex(,,@ProductId_Array,@PointerPrev+1)
set@TId=cast(SUBSTRING(@ProductId_Array,@PointerPrev,@PointerCurr-@PointerPrev)asint)
InsertintoProductListSpecial(ModuleId,ProductId)Values(@ModuleId,@TId)
SET@PointerPrev=@PointerCurr
while(@PointerPrev+1<LEN(@ProductId_Array))
Begin
Set@PointerCurr=CharIndex(,,@ProductId_Array,@PointerPrev+1)
if(@PointerCurr>0)
Begin
set@TId=cast(SUBSTRING(@ProductId_Array,@PointerPrev+1,@PointerCurr-@PointerPrev-1)asint)
InsertintoProductListSpecial(ModuleId,ProductId)Values(@ModuleId,@TId)
SET@PointerPrev=@PointerCurr
End
else
Break
End

set@TId=cast(SUBSTRING(@ProductId_Array,@PointerPrev+1,LEN(@ProductId_Array)-@PointerPrev)asint)
InsertintoProductListSpecial(ModuleId,ProductId)Values(@ModuleId,@TId)
SetNoCountOFF
iferror=0
begin
committransaction
end
else
begin
rollbacktransaction
end
GO

网友Bizlogic对此的改善办法:
应当用SQL2000OpenXML更复杂,效力更高,代码更可读:


CREATEProcedure[dbo].[ProductListUpdateSpecialList]
(
@ProductId_ArrayNVARCHAR(2000),
@ModuleIdINT
)

AS

deletefromProductListSpecialwhereModuleId=@ModuleId

--Ifempty,return
IF(@ProductId_ArrayISNULLORLEN(LTRIM(RTRIM(@ProductId_Array)))=0)
RETURN

DECLARE@idocint

EXECsp_xml_preparedocument@idocOUTPUT,@ProductId_Array

InsertintoProductListSpecial(ModuleId,ProductId)
Select
@ModuleId,C.[ProductId]
FROM
OPENXML(@idoc,/Products/Product,3)
with(ProductIdint)asC
where
C.[ProductId]isnotnull

EXECsp_xml_removedocument@idoc
因此我们的保存数据方法就是:在删除的动作开始之前,把表数据备份起来,然后留一个空表,在空表上执行“删除”操作。
小妖女 该用户已被删除
沙发
发表于 2015-1-19 21:26:35 | 只看该作者
数据库物理框架没有变动undo和redo都放在数据库得transaction中,个人感觉是个败笔。如果说我们在设计数据库的时候考虑分多个数据库,可能能在一定程度上避免I/O效率问题。
透明 该用户已被删除
板凳
发表于 2015-1-25 17:35:55 | 只看该作者
对于微软系列的东西除了一遍遍尝试还真没有太好的办法
金色的骷髅 该用户已被删除
地板
发表于 2015-2-3 12:06:39 | 只看该作者
呵呵,这就是偶想说的
再见西城 该用户已被删除
5#
发表于 2015-2-8 20:56:07 | 只看该作者
而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~
变相怪杰 该用户已被删除
6#
发表于 2015-2-26 10:37:33 | 只看该作者
语句级快照和事务级快照终于为SQLServer的并发性能带来了突破。个人感觉语句级快照大家应该应用。事务级快照,如果是高并发系统还要慎用。如果一个用户总是被提示修改不成功要求重试时,会杀人的!
兰色精灵 该用户已被删除
7#
发表于 2015-3-8 13:35:19 | 只看该作者
Mirror可以算是SQLServer的Dataguard了。但是能不能被大伙用起来就不知道了。
爱飞 该用户已被删除
8#
发表于 2015-3-16 00:50:08 | 只看该作者
很多书籍啊,不过个人认为看书太慢,还不如自己学。多做实际的东西,就会遇到很多问题,网上搜下解决问题。不断重复这个过程,在配合sql的F1功能。
蒙在股里 该用户已被删除
9#
发表于 2015-3-22 18:11:47 | 只看该作者
入门没那么困难,精通没那么容易
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-6-16 13:22

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表