深爱那片海 发表于 2015-1-16 22:42:28

MSSQL网页编程之给SQL Server传送数组参数的变通举措

“数据行级锁定”的意思是指在事务操作的执行过程中锁定正在被处理的个别记录,不让其他用户进行访问。这种锁定将影响到(但不限于)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.
(
@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.
FROM
OPENXML(@idoc,/Products/Product,3)
with(ProductIdint)asC
where
C.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

呵呵,这就是偶想说的

再见西城 发表于 2015-2-8 20:56:07

而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~

变相怪杰 发表于 2015-2-26 10:37:33

语句级快照和事务级快照终于为SQLServer的并发性能带来了突破。个人感觉语句级快照大家应该应用。事务级快照,如果是高并发系统还要慎用。如果一个用户总是被提示修改不成功要求重试时,会杀人的!

兰色精灵 发表于 2015-3-8 13:35:19

Mirror可以算是SQLServer的Dataguard了。但是能不能被大伙用起来就不知道了。

爱飞 发表于 2015-3-16 00:50:08

很多书籍啊,不过个人认为看书太慢,还不如自己学。多做实际的东西,就会遇到很多问题,网上搜下解决问题。不断重复这个过程,在配合sql的F1功能。

蒙在股里 发表于 2015-3-22 18:11:47

入门没那么困难,精通没那么容易
页: [1]
查看完整版本: MSSQL网页编程之给SQL Server传送数组参数的变通举措