我在XYZ
表的一列中有XML
,并且我需要Amount
使用新值而不是0.00更新元素,并且使用两个不同值而不是空白的PolicyReference
和AccountReference
元素来更新。
例如:
<PolicyReference>7657576567</PolicyReference>
<AccountReference>7657576875</AccountReference>
这是我在专栏中的XML:
<document>
<StatusCode>ACV</StatusCode>
<PaymentMethodDetail>
<EFT>
<AccountNumber>123456789</AccountNumber>
<AccountName>ABCDEFGHIJK</AccountName>
</EFT>
</PaymentMethodDetail>
<PaymentExtendedData>
<CHECK>
<Source>System</Source>
<SourceType>ACH</SourceType>
</CHECK>
</PaymentExtendedData>
<PostMarkDate />
<EntryUserId>1</EntryUserId>
<Amount>0.00</Amount>
<EntryDate />
<PolicyLineOfBusiness>LOL</PolicyLineOfBusiness>
<PolicyReference />
<AccountReference />
<AccountId>2034001793</AccountId>
</document>
这是我尝试过的:
UPDATE XYZ
SET XmlPayload.modify('replace value of (//document/PolicyReference/)[1] with "<PolicyReference>275654</PolicyReference>"')
WHERE PaymentSearchId = 18785
我收到一个错误:
消息9341,级别16,状态1,第4行
XQuery [XYZ.XmlPayload.modify()]:“)”附近的语法错误,应包含步骤表达式
我认为这是一个很好的问题,因为它提出了一个有趣的挑战,即拥有一个没有文本值的现有元素。这与简单地添加新元素或替换现有元素的内容不同。
但是,首先,您提供的XML已损坏。如果那是您要接收的XML,则还有其他问题。例如,在您最初的问题中,您</AccountReference>
本身就有一个无效的语法。我<AccountReference/>
在您的问题和示例中都对此进行了纠正。
对于空的XML元素,您需要调用insert text
XML.modify方法的DML。
DECLARE @xml XML =
'<document>
<StatusCode>ACV</StatusCode>
<PaymentMethodDetail>
<EFT>
<AccountNumber>123456789</AccountNumber>
<AccountName>ABCDEFGHIJK</AccountName>
</EFT>
</PaymentMethodDetail>
<PaymentExtendedData>
<CHECK>
<Source>System</Source>
<SourceType>ACH</SourceType>
</CHECK>
</PaymentExtendedData>
<PostMarkDate />
<EntryUserId>1</EntryUserId>
<Amount>0.00</Amount>
<EntryDate />
<PolicyLineOfBusiness>LOL</PolicyLineOfBusiness>
<PolicyReference />
<AccountReference />
<AccountId>2034001793</AccountId>
</document>';
DECLARE
@Amount DECIMAL(18,2) = 99.95,
@AccountReference VARCHAR(20) = '7657576875',
@PolicyReference VARCHAR(20) = '7657576567';
/* Update Amount */
SET @xml.modify('
replace value of (/document/Amount/text())[1]
with sql:variable("@Amount")
');
/* Insert the AccountReference text */
SET @xml.modify('
insert text {sql:variable("@AccountReference")} into (/document/AccountReference[1])[1]
');
/* Insert the PolicyReference text */
SET @xml.modify('
insert text {sql:variable("@PolicyReference")} into (/document/PolicyReference[1])[1]
');
/* Show updated XML */
SELECT @xml;
更新后的XML现在是:
<document>
<StatusCode>ACV</StatusCode>
<PaymentMethodDetail>
<EFT>
<AccountNumber>123456789</AccountNumber>
<AccountName>ABCDEFGHIJK</AccountName>
</EFT>
</PaymentMethodDetail>
<PaymentExtendedData>
<CHECK>
<Source>System</Source>
<SourceType>ACH</SourceType>
</CHECK>
</PaymentExtendedData>
<PostMarkDate />
<EntryUserId>1</EntryUserId>
<Amount>99.95</Amount>
<EntryDate />
<PolicyLineOfBusiness>LOL</PolicyLineOfBusiness>
<PolicyReference>7657576567</PolicyReference>
<AccountReference>7657576875</AccountReference>
<AccountId>2034001793</AccountId>
</document>
更新表的示例:
DECLARE @xyz TABLE ( PaymentSearchId INT, XmlPayload XML );
INSERT INTO @xyz VALUES ( 18785,
'<document>
<StatusCode>ACV</StatusCode>
<PaymentMethodDetail>
<EFT>
<AccountNumber>123456789</AccountNumber>
<AccountName>ABCDEFGHIJK</AccountName>
</EFT>
</PaymentMethodDetail>
<PaymentExtendedData>
<CHECK>
<Source>System</Source>
<SourceType>ACH</SourceType>
</CHECK>
</PaymentExtendedData>
<PostMarkDate />
<EntryUserId>1</EntryUserId>
<Amount>0.00</Amount>
<EntryDate />
<PolicyLineOfBusiness>LOL</PolicyLineOfBusiness>
<PolicyReference />
<AccountReference />
<AccountId>2034001793</AccountId>
</document>' );
DECLARE
@PaymentSearchId INT = 18785,
@Amount DECIMAL(18,2) = 99.95,
@AccountReference VARCHAR(20) = '7657576875',
@PolicyReference VARCHAR(20) = '7657576567';
/* Update Amount */
UPDATE @xyz
SET XmlPayload.modify('
replace value of (/document/Amount/text())[1]
with sql:variable("@Amount")
')
WHERE PaymentSearchId = @PaymentSearchId;
/* Insert the AccountReference text */
UPDATE @xyz
SET XmlPayload.modify('
insert text {sql:variable("@AccountReference")} into (/document/AccountReference[1])[1]
')
WHERE PaymentSearchId = @PaymentSearchId;
/* Insert the PolicyReference text */
UPDATE @xyz
SET XmlPayload.modify('
insert text {sql:variable("@PolicyReference")} into (/document/PolicyReference[1])[1]
')
WHERE PaymentSearchId = @PaymentSearchId;
/* Show updated XML */
SELECT XmlPayload FROM @xyz WHERE PaymentSearchId = @PaymentSearchId;
问题内容: 让我们有一个示例片段: 我不知道如何更新该属性的值。 问题答案: 在这里阅读更多有关它的信息。XML数据修改语言(XML DML)
问题内容: 我在SQL Server 2008中有一个表,其中有一些列。这些列之一是Xml格式,我想更新一些属性。 例如,我的Xml列的名称为,它在前5行中的值如下: 我想将所有属性设置为30到40,如下所示: 问题答案: 从问题的早期版本看来,您的XML实际上位于表的不同行上。在这种情况下,您可以使用此功能。 使用表变量的工作样本。
问题内容: 我在一个表中有一个XML列,如下所示: 我想像这样更新此字段: 我想通过SQL Server中的一个函数来做。 谢谢! 问题答案: 正如Mikael所述,您需要描述更新背后的逻辑。但是对于上面的预期输出,以下应该起作用:
问题内容: 我想编译一个安装程序,该安装程序将使用用户提供的凭据连接到远程数据库,然后使用.sql脚本安装一些数据库组件。 使用Inno Setup可以做到吗? 更多细节: 我想要一个自定义表单,要求用户输入数据库地址和凭据,然后运行将执行sql脚本的命令,该脚本将更新远程数据库服务器。 如果更新成功-成功完成安装。 这是一个相当普遍的问题-我有很多定制的设置应连接到不同的服务器/运行不同的脚本-
问题内容: 我目前正在处理xml项目。到目前为止,我已经使用Dom Parser成功地将xml链接到java类。我在下面提供了代码。我正在努力的是将开始日期的月份更新一个月,因此类似2/1 / 2013、3 / 1/2013 …的内容将相应地在xml文件中更改。我在底部有方法调用,但是当我调用它时,xml文件不会更新它的值。帮助将不胜感激 之前的* data.xml * 想要data.xml 之后
我正在使用liquibase更新数据库。 我有文件changelog-master.xml,其中包含: 在resource/src/main/resources/dbchangelog/ddl/中,我有一个带有脚本的文件MS sql: 错误: 是否可以运行典型的MS SQL脚本或liquibase会有问题?