sql-server - 对 xml 列执行 "insert only if node with specific value does not exist"的有效方法

标签 sql-server xml t-sql xquery-sql

比如说,我有一个如下所示的 xml 列:

<mi>
  <m>42</m>
</mi>

假设表:

Word(WordId:bigint, Wordtext:nvarchar, MessageIndex:xml)

如果 @MessageId 已存在于 Messageindex 的 xml 树中的某处,我不希望以下参数化查询插入新的 xml 节点,而是要么失败并显示确定性错误代码,要么默默地失败:

begin try
    insert into Word (WordText, MessageIndex) values (@WordText, '<mi></mi>');
    update Word set MessageIndex.modify('insert (<m>{sql:variable(""@MessageId"")}</m>) into(/mi)[1]') where WordId = scope_identity();
end try
begin catch
    if error_number() = 2627
    begin
        update Word set
            MessageIndex.modify('insert (<m>{sql:variable(""@MessageId"")}</m>) into(/mi)[1]')
        where
            WordText = @WordText;
    end
    else
        throw
end catch

从 Word 中选择 WordId,其中 WordText = @WordText;

如何有效实现这一目标?

最佳答案

这样的东西对你有用吗?

DECLARE @Word TABLE (WordId bigint identity, Wordtext NVARCHAR(20), MessageIndex xml ) 

insert into @word ( messageIndex )
select '<mi> 
  <m>42</m> 
</mi>'

DECLARE @WordText NVARCHAR(20) = 'wordText'
DECLARE @messageId INT = 42

begin try 

    if exists ( select 1 from @Word where MessageIndex.exist('//mi[.=sql:variable("@MessageId")]') = 0 )
    begin
        insert into @Word (WordText, MessageIndex) values (@WordText, '<mi></mi>'); 

        update @Word set MessageIndex.modify('insert <m>{sql:variable("@MessageId")}</m> into (mi)[1]') 
        where WordId = scope_identity(); 

    end
    --else
        -- do something here?

end try 
begin catch 
    if error_number() = 2627 
    begin 
        update @Word set MessageIndex.modify('insert <m>{sql:variable("@MessageId")}</m> into (mi)[1]') 
        where WordText = @WordText; 
    end 
    else 
        throw 
end catch 

select * from @Word

关于sql-server - 对 xml 列执行 "insert only if node with specific value does not exist"的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12452522/

相关文章:

database - 使用除 SQL Server 之外的排序规则冲突

sql-server - 为什么当我尝试创建存储过程时出现错误?

sql-server - 运行 Invoke-SqlCmd 时传递字符串参数?

sql-server - 在 SQL Server 中保存日期

xml - 在 XML 的开头添加子节点

Android - 避免布局重复

c# - 将对象保存到数据库?

sql - 从 SchemaB SQL Server 中定义的 View 调用 schemaA 中定义的用户定义函数

ios - 从 URL 解析和加载 XML 数据

sql-server - SQL CLR - 即使用户具有访问权限,TSQL UDF 上仍出现权限错误