Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
替换xml属性值中的特殊字符_Xml_Sql Server 2008_Replace_Xquery Sql - Fatal编程技术网

替换xml属性值中的特殊字符

替换xml属性值中的特殊字符,xml,sql-server-2008,replace,xquery-sql,Xml,Sql Server 2008,Replace,Xquery Sql,我需要更新表中的xml列,以删除特定节点评级Ratingtype=“未知”的特殊字符(%)。上述节点以外的节点中存在的特殊字符不应更改。下面是我的输入和期望的结果 Input xml: <Ratings> <Rating Ratingtype="unknown"> <AppliedKnowledge value="Yes%">3.0</Applie

我需要更新表中的xml列,以删除特定节点评级Ratingtype=“未知”的特殊字符(%)。上述节点以外的节点中存在的特殊字符不应更改。下面是我的输入和期望的结果

            Input xml:
            <Ratings>
              <Rating Ratingtype="unknown">
                <AppliedKnowledge value="Yes%">3.0</AppliedKnowledge>
                <ToolSkills>3.5</ToolSkills>
              </Rating>
              <Rating Ratingtype="known">
              <AppliedKnowledge value="%Yes%">3.0</AppliedKnowledge>
                <Experience>9.5</Experience>
                <Education>16.0</Education>
                <DbDevelopment>4.5</DbDevelopment>
              </Rating>
              <Rating Ratingtype="unknown">
                <AppliedKnowledge value="%No%">4.0</AppliedKnowledge>
                <ToolSkills>4.5</ToolSkills>
              </Rating>
            </Ratings>

            Expected output xml:
            <Ratings>
              <Rating Ratingtype="unknown">
                <AppliedKnowledge value="Yes">3.0</AppliedKnowledge>
                <ToolSkills>3.5</ToolSkills>
              </Rating>
              <Rating Ratingtype="known">
              <AppliedKnowledge value="%Yes%">3.0</AppliedKnowledge>
                <Experience>9.5</Experience>
                <Education>16.0</Education>
                <DbDevelopment>4.5</DbDevelopment>
              </Rating>
              <Rating Ratingtype="unknown">
                <AppliedKnowledge value="No">4.0</AppliedKnowledge>
                <ToolSkills>4.5</ToolSkills>
              </Rating>
            </Ratings>
输入xml:
3
3.5
3
9.5
16
4.5
4
4.5
预期输出xml:
3
3.5
3
9.5
16
4.5
4
4.5

与你的上一个问题类似,这不是一件容易的事

.modify()
方法允许每次调用进行一次更改。这意味着您必须使用某种循环

仍然有一些方法:

如果
%
没有在其他任何地方使用,您可以简单地执行以下操作: 将XML强制转换为
VARCHAR
,执行简单的文本替换并将其强制转换回

SELECT CAST(REPLACE(CAST(@YourXml AS VARCHAR(MAX)),'%','')  AS XML)
比循环更好的是这个 分解XML并重新构建它。仅对目标值使用
REPLACE

DECLARE @x XML=
'<Ratings>
  <Rating Ratingtype="unknown">
    <AppliedKnowledge value="Yes%">3.0</AppliedKnowledge>
    <ToolSkills>3.5</ToolSkills>
  </Rating>
  <Rating Ratingtype="known">
    <AppliedKnowledge value="%Yes%">3.0</AppliedKnowledge>
    <Experience>9.5</Experience>
    <Education>16.0</Education>
    <DbDevelopment>4.5</DbDevelopment>
  </Rating>
  <Rating Ratingtype="unknown">
    <AppliedKnowledge value="%No%">4.0</AppliedKnowledge>
    <ToolSkills>4.5</ToolSkills>
  </Rating>
</Ratings>';

SELECT CAST(REPLACE(CAST(@x AS VARCHAR(MAX)),'%','')  AS XML)

SELECT R.value('@Ratingtype','varchar(max)') AS [@Ratingtype]
      ,CASE WHEN R.value('@Ratingtype','varchar(max)')='unknown'
            THEN REPLACE(R.value('(AppliedKnowledge/@value)[1]','varchar(max)'),'%','')
            ELSE R.value('(AppliedKnowledge/@value)[1]','varchar(max)') END AS [AppliedKnowledge/@Value]
      ,R.value('AppliedKnowledge[1]','varchar(max)') AS [AppliedKnowledge]
      ,R.value('ToolSkills[1]','varchar(max)') AS [ToolSkills]
      ,R.value('Experience[1]','varchar(max)') AS [Experience]
      ,R.value('Education[1]','varchar(max)') AS [Education]
      ,R.value('DbDevelopment[1]','varchar(max)') AS [DbDevelopment]
FROM @x.nodes('/Ratings/Rating') AS A(R)
FOR XML PATH('Rating'),ROOT('Ratings')
DECLARE@xxml=
'
3
3.5
3
9.5
16
4.5
4
4.5
';
选择CAST(替换(CAST(@x为VARCHAR(MAX))、“%”、“”)为XML)
选择R.value(“@Ratingtype”,“varchar(max)”作为[@Ratingtype]
,R.value(“@Ratingtype”,“varchar(max)”为“未知”时的大小写
然后替换(R.value('(AppliedKnowledge/@value)[1],'varchar(max)','%,'')
ELSE R.value('(AppliedKnowledge/@value)[1],'varchar(max')以[AppliedKnowledge/@value]结尾
,R.value('AppliedKnowledge[1]”,'varchar(max)'AS[AppliedKnowledge]
,R.value('ToolSkills[1]”,'varchar(max)'AS[ToolSkills]
,R.value('Experience[1]”,'varchar(max)'AS[Experience]
,R.value('Education[1]”,'varchar(max)'AS[Education]
,R.value('DbDevelopment[1]”,'varchar(max)'AS[DbDevelopment]
从@x.nodes('/Ratings/Rating')开始,作为(R)
对于XML路径(“分级”),根(“分级”)
结果

<Ratings>
  <Rating Ratingtype="unknown">
    <AppliedKnowledge Value="Yes">3.0</AppliedKnowledge>
    <ToolSkills>3.5</ToolSkills>
  </Rating>
  <Rating Ratingtype="known">
    <AppliedKnowledge Value="%Yes%">3.0</AppliedKnowledge>
    <Experience>9.5</Experience>
    <Education>16.0</Education>
    <DbDevelopment>4.5</DbDevelopment>
  </Rating>
  <Rating Ratingtype="unknown">
    <AppliedKnowledge Value="No">4.0</AppliedKnowledge>
    <ToolSkills>4.5</ToolSkills>
  </Rating>
</Ratings>

3
3.5
3
9.5
16
4.5
4
4.5

是否有可能
%
标志是某个地方的通缉标志?是..如上面的输入XML所示。。我需要在Rating Ratingtype=“known”节点中为AppliedKnowledge标记添加%sign。在节点Rating Ratingtype=“unknown”中,我需要删除所有%signRaj,请检查我编辑的答案@shnugo…我也应该添加这一点..我的xml列树结构可能不同于每个值,比如根元素可能是评级或超级评级,所以有没有一种方法可以动态执行此操作。?Hi Raj,请提供一个或两个实际xml示例。动态方法只能与循环一起工作。这又慢又丑。。。但有时是必要的。。。