c# - 仅当 xml 数据从 C# 传递到存储过程时,才在存储过程中使用删除表查询

标签 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) 假设在执行此过程结束后读取用户表中的数据,此过程在并发环境中不安全。如果两个连接执行相同的过程(使用不同的 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/

相关文章:

c# - C# 开发人员的 C++ 命名约定

MySQL Procedure IN 变量不能正常工作

php - 如何替换 mysql_result 来实现简单的登录系统

php - SQL 参数数据类型 int 对于 charindex 函数的参数 1 无效

sql - 星型架构设计/最佳实践

SQL - 将表传递给 Select 中的 UDF

c# - 为什么 WPF 设计器无法加载调用非托管 DLL 的库?

c# - 分区键的天蓝色存储大小超出范围?

SQL 触发器 - 如何获取更新的值?

c# - 即使 CausesValidation 为 false,也检查页面是否有效