gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:29:55 25 4
gpt4 key购买 nike

比如说,我有一个看起来像这样的 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 where 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com