gpt4 book ai didi

sql-server - 使用 XML-DML 在现有实例中动态插入 XML 节点的位置

转载 作者:行者123 更新时间:2023-12-02 00:50:24 27 4
gpt4 key购买 nike

如果可以在 SQL Server (2012) 中的现有 xml 实例中动态插入 xml 节点,我还没有找到任何文档。我知道您可以插入或替换条件值,但如果可以根据某些条件动态完成插入位置,似乎没有任何文档。例如,假设我有这个 XML-DML 调用:

SET @xml.modify('insert <SecondaryContact><Name>{ sql:variable("@contactName") }</Name>
<Phone>{ sql:variable("@contactPhone") }</Phone>
<Email>{ sql:variable("@contactEmail") }</Email></SecondaryContact>
after (/Project/PrimaryContact)[1]');

将对 after 之后列出的节点进行修改关键字是有条件的是有效语法吗?以下是我所指的示例:

SET @xml.modify('insert <TechnicalContact><Name>{ sql:variable("@contactName") }</Name>
<Phone>{ sql:variable("@contactPhone") }</Phone>
<Email>{ sql:variable("@contactEmail") }</Email></TechnicalContact>
after (
if(count(/Project/SecondaryContact) = 0)
then (/Project/PrimaryContact)[1]
else (/Project/SecondaryContact)(1)
)');

是动态选择位置的唯一方法 IF..ELSE XML DML 语句之外的语句,或者我的示例 XML-DML 是否有效?

编辑 示例 XML:

<root>
...
<PrimaryContact Id="1234">
<Name>John Doe</Name>
<Phone>555-555-5555</Phone>
<Email>somewhere@test.com</Email>
</PrimaryContact>
<SecondaryContact Id="1236"> <--OPTIONAL
<Name>John Doe1</Name>
<Phone>555-555-5556</Phone>
<Email>somewhere1@test.com</Email>
</SecondaryContact>
<TechnicalContact Id="2234"> <--OPTIONAL
<Name>John Doe2</Name>
<Phone>555-555-5255</Phone>
<Email>somewhere3@test.com</Email>
</TechnicalContact>
...
</root>

我知道结构不理想。应该是<Contacts><Contact Type="PRIMARY" Id="1234">...</Contact>...</Contacts> , 但想看看动态插入位置是否可以在 DML 语句中实现。对于这个问题,可以使用游标,因为它适用于一次性更新。

最佳答案

这个建议并不完全相同,因为它将插入在文档中后面出现的那个之后,而不是在 SecondaryContact 之后,但我怀疑你的情况是一样的:

SET @xml.modify('insert 
<TechnicalContact><Name>{ sql:variable("@contactName") }</Name>
<Phone>{ sql:variable("@contactPhone") }</Phone>
<Email>{ sql:variable("@contactEmail") }</Email></TechnicalContact>

after (/Project/*[
local-name(.) = "SecondaryContact"
or local-name(.) = "PrimaryContact"
])[last()]
');

或者:

if @xml.value('count(/Project/SecondaryContact)', 'int') = 0
begin
SET @xml.modify('insert <TechnicalContact><Name>{ sql:variable("@contactName") }</Name>
<Phone>{ sql:variable("@contactPhone") }</Phone>
<Email>{ sql:variable("@contactEmail") }</Email></TechnicalContact>
after (/Project/PrimaryContact)[1]
');
end else begin
SET @xml.modify('insert <TechnicalContact><Name>{ sql:variable("@contactName") }</Name>
<Phone>{ sql:variable("@contactPhone") }</Phone>
<Email>{ sql:variable("@contactEmail") }</Email></TechnicalContact>
after (/Project/SecondaryContact)[1]
');
end

关于sql-server - 使用 XML-DML 在现有实例中动态插入 XML 节点的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40423748/

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