这是我从后端C#传递到存储过程的表的Xml数据。
<ArrayOfUserData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<UserData>
<Name>Dovyan<Name />
<id>434556464<id />
</UserData>
<UserData>
<Name>Alex<Name />
<id>12345767<id />
</UserData>
</ArrayOfUserData>
这是我正在使用的存储过程
USE [DATABASE]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [DATABASE].[sp_SaveUsertable]
(
@in_params AS XML
)
AS
BEGIN
DELETE FROM dbo.usertable; //use this only when xml data is present. how to do this part ?
select
T.x.value('./Name[1]','varchar(6)') as [Name] ,
T.x.value('./id[1]','varchar(75)') as [id]
into #Temp
from @in_params.nodes('/ArrayOfUserData/UserData') as T(x);
BEGIN TRANSACTION
INSERT INTO [dbo].[usertable](Name,id)
SELECT Name,id FROM #Temp AS T
COMMIT TRANSACTION
drop table #Temp;
END
这是我的查询。 如您所见,我首先删除表,然后将xml数据保存到表中。可能存在xml数据为空的情况。存储过程将删除该表,但不会保存新数据,因为它是空的。
我想提出一个只有在有xml数据时才删除表的条件。如果没有xml数据,请不要删除该表。有办法吗?
答案 0 :(得分:1)
1)假设在执行此过程后,将读取来自usertable的数据,此过程在concurent环境中不安全。如果两个连接执行相同的过程(使用差异XML数据)然后读取先前插入的数据,则一个连接可以读取由第二个连接插入的数据。这是理想的行为吗?
2)你可以使用
select
T.x.value('./Name[1]','varchar(6)') as [Name] ,
T.x.value('./id[1]','varchar(75)') as [id]
into #Temp
from @in_params.nodes('/ArrayOfUserData/UserData') as T(x);
IF @@ROWCOUNT > 0 -- Num of affetected rows
BEGIN
DELETE FROM dbo.usertable;
...
END
ELSE
BEGIN
...
END