仅当xml数据从C#传递到存储过程时,才在存储过程中使用Delete table query

时间:2016-06-06 19:51:17

标签: c# mysql sql-server xml stored-procedures

这是我从后端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 个答案:

答案 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