当前位置: 首页 > 面试题库 >

如何在SQL脚本中使用新值更新XML元素

娄振
2023-03-14
问题内容

我在XYZ表的一列中有XML
,并且我需要Amount使用新值而不是0.00更新元素,并且使用两个不同值而不是空白的PolicyReferenceAccountReference元素来更新。

例如:

<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 textXML.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会有问题?