无法在路径中使用<xsi:type =>设置SQL XML节点级别

时间:2019-12-19 13:43:23

标签: sql sql-server xml path xsitype

我正在尝试使用下面的SQL更新语句修改XML数据类型字段。我无法设置通过级别/Operand xsi:type="QueryObjectKey"/到达/Name/字段的正确路径。我可以设置路径来毫无问题地修改/GroupBegin/false/GroupBegin/之类的父字段/值,所以我知道SQL语句是正确的,只是到达/Name/的路径语法不正确。

我收到这个模棱两可的错误消息

  

信息2205,第16级,状态1,第6行
  应当使用XQuery [ACVSCore.Access.Query.XMLEncodedCriteria.modify()]:“)”。

如何设置该路径以包含/ Operand xsi:type =“ QueryObjectKey” /

DECLARE @NewValue Varchar(255) =  'None'

update
[ACVSCore].[Access].[Query]
SET
    XMLEncodedCriteria.modify('replace value of 
    (/QueryExpression/Criteria/CriteriaExpression/Operand xsi:type="QueryObjectKey"/Index/text())[1] with sql:variable("@NewValue")')
<QueryExpression xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" PrimaryObjectType="SoftwareHouse.NextGen.Common.SecurityObjects.Personnel" DataFetcherType="SoftwareHouse.CrossFire.Common.Objects.DataQuery">
  <DataFetcherTag xsi:type="xsd:string" />
  <Criteria>
    <CriteriaExpression>
      <GroupBegin>false</GroupBegin>
      <Operand xsi:type="QueryObjectKey">
        <Name>ORIGINAL</Name>
      </Operand>
    </CriteriaExpression>
  </Criteria>
</QueryExpression>

1 个答案:

答案 0 :(得分:0)

您的XML使用的是没有声明的名称空间。首先,您需要修复XML,然后修改所需的XML元素值。 供参考:What is the difference between xsd and xsi?

  

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, xml_data XML);
INSERT INTO @tbl (xml_data) 
VALUES ('<QueryExpression xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                 PrimaryObjectType="SoftwareHouse.NextGen.Common.SecurityObjects.Personnel"
                 DataFetcherType="SoftwareHouse.CrossFire.Common.Objects.DataQuery">
    <DataFetcherTag xsi:type="xsd:string"/>
    <Criteria>
        <CriteriaExpression>
            <GroupBegin>false</GroupBegin>
            <Operand xsi:type="QueryObjectKey">
                <Name>ORIGINAL</Name>
            </Operand>
        </CriteriaExpression>
    </Criteria>
</QueryExpression>');
-- DDL and sample data population, end

-- before
SELECT * FROM @tbl;

DECLARE @NewValue VARCHAR(10) = 'None';
UPDATE @tbl
SET xml_data.modify('replace value of 
(/QueryExpression/Criteria/CriteriaExpression/Operand/Name/text())[1] with (sql:variable("@NewValue"))');

-- after
SELECT * FROM @tbl;