这是我从后端 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数据,则不要删除该表。有什么办法可以做到吗?
最佳答案
1) 假设在执行此过程结束后读取用户表中的数据,此过程在并发环境中不安全。如果两个连接执行相同的过程(使用不同的 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
关于c# - 仅当 xml 数据从 C# 传递到存储过程时,才在存储过程中使用删除表查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37665742/