【问题标题】:replace XMLNode in a XMLString Column of a table in SQL Server替换 SQL Server 中表的 XMLString 列中的 XMLNode
【发布时间】:2015-12-05 04:20:44
【问题描述】:

我想从表“Rubric”中删除属性“identifier”值不是“RESPONSE”的xmlnode <responseDeclaration>;其中包含字符串类型的“XMLString”列和 Xml 类型的“XMLNode”列。在删除节点"<responseDeclaration>" 之前,我们需要将要删除到临时变量中的节点的 Outerxml;在这种情况下是

 "<responseDeclaration identifier="VH182077_zone_choice_list_9.RESPONSE" baseType="identifier" cardinality="single" />"

以下是“XMLNode”和“XMLString”列的内容

<assessmentItem xmlns:xi="http://www.w3.org/2001/XInclude" xmlns="http://www.imsglobal.org/xsd/imsqti_v2p2"  timeDependent="false" title="ZonesSS" toolVersion="1.0" toolName="Rubric">
  <responseDeclaration baseType="identifier" cardinality="single" identifier="RESPONSE">
    <correctResponse>
      <value>i3</value>
    </correctResponse>
  </responseDeclaration>
  <responseDeclaration identifier="VH182077_zone_choice_list_9.RESPONSE" baseType="identifier" cardinality="single" />
  <outcomeDeclaration baseType="float" cardinality="single" identifier="SCORE">
    <defaultValue>
      <value>0</value>
    </defaultValue>
  </outcomeDeclaration>
  <responseProcessing template="http://www.imsglobal.org/question/qti_v2p1/rptemplates/match_correct_1.xml" />
</assessmentItem>

以下是我在两列中寻找的结果。我们在“Rubric”表中确实有这类记录。

<assessmentItem xmlns:xi="http://www.w3.org/2001/XInclude" xmlns="http://www.imsglobal.org/xsd/imsqti_v2p2" identifier="3c6e5f58-bd87-e511-ba0c-005056a8223d" timeDependent="false" title="ZonesSS" toolVersion="1.0" toolName="IAT Rubric">
  <responseDeclaration baseType="identifier" cardinality="single" identifier="RESPONSE">
    <correctResponse>
      <value>i3</value>
    </correctResponse>
  </responseDeclaration>
  <outcomeDeclaration baseType="float" cardinality="single" identifier="SCORE">
    <defaultValue>
      <value>0</value>
    </defaultValue>
  </outcomeDeclaration>
  <responseProcessing template="http://www.imsglobal.org/question/qti_v2p1/rptemplates/match_correct_1.xml" />
</assessmentItem>

试图通过以下查询获取我想删除的节点的字符串值;但没有成功。

 Declare @RDNode as 
    ;WITH XMLNAMESPACES 
    ('http://www.imsglobal.org/xsd/imsqti_v2p2' AS ns)
   SET @RDNode= select cast(XmlString as xml).value('(/ns:assessmentItem/ns:responseDeclaration[2])[1]', 'nvarchar(max)')
    FROM dbo.Rubric R WHERE R.[XML].exist('(/ns:assessmentItem/ns:responseDeclaration[2]/@identifier[contains(.,".RESPONSE")])')=1
    WHERE ..

试图从“XMLNode”中删除第二个 ResponseDeclaration 节点

;WITH XMLNAMESPACES 
('http://www.imsglobal.org/xsd/imsqti_v2p2' AS ns)
Update dbo.Rubric 
SET [XMLNode].modify('replace value of (/ns:assessmentItem/ns:responseDeclaration[2])[1] with ""')
WHERE ....

【问题讨论】:

    标签: sql-server xml tsql xquery-sql


    【解决方案1】:

    "我要删除属性"identifier"值不是"RESPONSE"的xmlnode..."

    使用 delete 关键字而不是 replace value of 从 XML 数据类型中删除节点:

    ;WITH XMLNAMESPACES ('http://www.imsglobal.org/xsd/imsqti_v2p2' AS ns)
    Update dbo.Rubric
    SET [XMLNode].modify('
        delete /ns:assessmentItem/ns:responseDeclaration[@identifier != "RESPONSE"]
    ')
    

    并使用query() 方法而不是value() 来获取将被删除的XML 标记:

    Declare @RDNode as XML
    ;WITH XMLNAMESPACES ('http://www.imsglobal.org/xsd/imsqti_v2p2' AS ns)
    select @RDNode =  R.[XMLNode].query('/ns:assessmentItem/ns:responseDeclaration[@identifier != "RESPONSE"]')
    FROM dbo.Rubric R 
    WHERE ....
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-23
    • 2016-11-25
    • 2016-07-11
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多