|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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因此我们的保存数据方法就是:在删除的动作开始之前,把表数据备份起来,然后留一个空表,在空表上执行“删除”操作。 |
|