Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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
Sql server 添加xml节点的SQL字符串操作_Sql Server_Xml_String_Tsql_Sql Server 2008 R2 - Fatal编程技术网

Sql server 添加xml节点的SQL字符串操作

Sql server 添加xml节点的SQL字符串操作,sql-server,xml,string,tsql,sql-server-2008-r2,Sql Server,Xml,String,Tsql,Sql Server 2008 R2,我使用的是sql 2008R2,表中有xml列,如- <New> <From> <Scale>Tony</Scale> <ScaleName>Name</ScaleName> </From> </New> <New> <From> <Scale>Tom</Scale>

我使用的是sql 2008R2,表中有xml列,如-

<New>
   <From>
        <Scale>Tony</Scale>
        <ScaleName>Name</ScaleName>
    </From>
</New>
<New>
    <From>
        <Scale>Tom</Scale>
        <ScaleName>Name</ScaleName>
    </From>
</New>

 <New>
    <From>
        <Scale>Seven</Scale>
        <ScaleName>Height</ScaleName>
    </From>
</New>
<New>
    <From>
        <Scale>Ten</Scale>
        <ScaleName>Height</ScaleName>
    </From>
</New>
<New>
    <From>
        <Scale>***XXX***</Scale>
        <ScaleName>Height</ScaleName>
   </From>
</New>

托尼
名称
汤姆
名称
七
高度
十
高度
***XXX***
高度
……等等

我需要编写一个SQL,它可以检查ScaleName的Scale没有使用ngXXX作为值的所有节点,然后添加/插入以下文本2次。当只有一个***XXX****条目时,应只添加/插入一次

<New>
    <From>
        <Scale>***XXX***</Scale>
        <ScaleName>Respective Scalename</ScaleName>
    </From>
</New>  

***XXX***
各自的鳞片名称
预期结果-----


托尼
名称
汤姆
名称
***XXX***
名称
***XXX***
名称
七
高度
十
高度
***XXX***
高度
***XXX***
高度

我不知道我是否完全理解您的需求,但这可能会有所帮助:

注意:大多数情况下是这样的使用诸如
***XXX***
..

这是您的示例XML。标尺
名称
没有
***XXX***
条目,标尺
高度
有一个

DECLARE @xml XML=
(N'<New>
  <From>
    <Scale>Tony</Scale>
    <ScaleName>Name</ScaleName>
  </From>
</New>
<New>
  <From>
    <Scale>Tom</Scale>
    <ScaleName>Name</ScaleName>
  </From>
</New>
<New>
  <From>
    <Scale>Seven</Scale>
    <ScaleName>Height</ScaleName>
  </From>
</New>
<New>
  <From>
    <Scale>Ten</Scale>
    <ScaleName>Height</ScaleName>
  </From>
</New>
<New>
  <From>
    <Scale>***XXX***</Scale>
    <ScaleName>Height</ScaleName>
  </From>
</New>');
--此
选择
将使用实际值重新生成整个XML,并添加两倍的
***XXX***
节点

SELECT (
            SELECT x.Scale AS [From/Scale]
                  ,x.ScaleName AS [From/ScaleName]
            FROM ScaleNames AS x
            WHERE x.ScaleName=ScaleNames.ScaleName
            FOR XML PATH('New'),TYPE
       )
      ,(SELECT
        (SELECT '***XXX***' AS Scale, ScaleName FOR XML PATH('From'),ROOT('New'),TYPE )
        ,(SELECT '***XXX***' AS Scale, ScaleName FOR XML PATH('From'),ROOT('New'),TYPE )
        FOR XML PATH(''),TYPE
       ) AS [node()]
FROM ScaleNames
GROUP BY ScaleName
FOR XML PATH('')
结果

<New>
  <From>
    <Scale>Seven</Scale>
    <ScaleName>Height</ScaleName>
  </From>
</New>
<New>
  <From>
    <Scale>Ten</Scale>
    <ScaleName>Height</ScaleName>
  </From>
</New>
<New>
  <From>
    <Scale>***XXX***</Scale>
    <ScaleName>Height</ScaleName>
  </From>
</New>
<New>
  <From>
    <Scale>***XXX***</Scale>
    <ScaleName>Height</ScaleName>
  </From>
</New>
<New>
  <From>
    <Scale>Tony</Scale>
    <ScaleName>Name</ScaleName>
  </From>
</New>
<New>
  <From>
    <Scale>Tom</Scale>
    <ScaleName>Name</ScaleName>
  </From>
</New>
<New>
  <From>
    <Scale>***XXX***</Scale>
    <ScaleName>Name</ScaleName>
  </From>
</New>
<New>
  <From>
    <Scale>***XXX***</Scale>
    <ScaleName>Name</ScaleName>
  </From>
</New>

七
高度
十
高度
***XXX***
高度
***XXX***
高度
托尼
名称
汤姆
名称
***XXX***
名称
***XXX***
名称

我不知道我是否完全理解您的需求,但这可能会有所帮助:

注意:大多数情况下是这样的使用诸如
***XXX***
..

这是您的示例XML。标尺
名称
没有
***XXX***
条目,标尺
高度
有一个

DECLARE @xml XML=
(N'<New>
  <From>
    <Scale>Tony</Scale>
    <ScaleName>Name</ScaleName>
  </From>
</New>
<New>
  <From>
    <Scale>Tom</Scale>
    <ScaleName>Name</ScaleName>
  </From>
</New>
<New>
  <From>
    <Scale>Seven</Scale>
    <ScaleName>Height</ScaleName>
  </From>
</New>
<New>
  <From>
    <Scale>Ten</Scale>
    <ScaleName>Height</ScaleName>
  </From>
</New>
<New>
  <From>
    <Scale>***XXX***</Scale>
    <ScaleName>Height</ScaleName>
  </From>
</New>');
--此
选择
将使用实际值重新生成整个XML,并添加两倍的
***XXX***
节点

SELECT (
            SELECT x.Scale AS [From/Scale]
                  ,x.ScaleName AS [From/ScaleName]
            FROM ScaleNames AS x
            WHERE x.ScaleName=ScaleNames.ScaleName
            FOR XML PATH('New'),TYPE
       )
      ,(SELECT
        (SELECT '***XXX***' AS Scale, ScaleName FOR XML PATH('From'),ROOT('New'),TYPE )
        ,(SELECT '***XXX***' AS Scale, ScaleName FOR XML PATH('From'),ROOT('New'),TYPE )
        FOR XML PATH(''),TYPE
       ) AS [node()]
FROM ScaleNames
GROUP BY ScaleName
FOR XML PATH('')
结果

<New>
  <From>
    <Scale>Seven</Scale>
    <ScaleName>Height</ScaleName>
  </From>
</New>
<New>
  <From>
    <Scale>Ten</Scale>
    <ScaleName>Height</ScaleName>
  </From>
</New>
<New>
  <From>
    <Scale>***XXX***</Scale>
    <ScaleName>Height</ScaleName>
  </From>
</New>
<New>
  <From>
    <Scale>***XXX***</Scale>
    <ScaleName>Height</ScaleName>
  </From>
</New>
<New>
  <From>
    <Scale>Tony</Scale>
    <ScaleName>Name</ScaleName>
  </From>
</New>
<New>
  <From>
    <Scale>Tom</Scale>
    <ScaleName>Name</ScaleName>
  </From>
</New>
<New>
  <From>
    <Scale>***XXX***</Scale>
    <ScaleName>Name</ScaleName>
  </From>
</New>
<New>
  <From>
    <Scale>***XXX***</Scale>
    <ScaleName>Name</ScaleName>
  </From>
</New>

七
高度
十
高度
***XXX***
高度
***XXX***
高度
托尼
名称
汤姆
名称
***XXX***
名称
***XXX***
名称

nd然后将文本添加到不存在的地方,持续2次-显示预期结果的外观没有根元素的XML(不是不可能的,但不是最佳选择…)?请解释,添加/插入以下文本的含义,共2次。我没有看到任何以下文本,您想在其中/为什么/插入什么内容两次?正如@RomanPerekhrest已经询问的那样:请提供预期的输出和您迄今为止尝试过的代码……添加/插入意味着添加XML代码。java basd应用程序需要此代码。XXX条目需要为每个唯一的ScaleNameExxx条目设置2次=***XXX***相应的Scalename预期结果在-预期结果------下,然后在不存在的地方添加文本,设置2次-显示应该如何显示预期结果没有根元素的XML(不是不可能的,但不是最佳选择?请解释,添加/插入以下文本的含义,共2次。我没有看到任何以下文本,您想在其中/为什么/插入什么内容两次?正如@RomanPerekhrest已经询问的那样:请提供预期的输出和您迄今为止尝试过的代码……添加/插入意味着添加XML代码。java basd应用程序需要此代码。对于每个唯一的ScaleNameExxx条目,XXX条目需要为2次=***XXX***对应的Scalename预期结果在-预期结果------哇!!!这是超级冷,我会检查和更新。关于magic word,它是java前端下拉列表的一部分。非常感谢。顺便问一下,有没有办法通过将xml读取为字符串来完成这项工作。刚刚进来case@Priya,很高兴帮助你!如果您喜欢,请在答案投票计数器下方的接受检查上打勾。关于将XML读取为字符串:只要字符串包含有效的XML,就可以通过
DECLARE@XML=(选择CAST(@SomeValidXML as XML))
来完成。最好使用
NVARCHAR
类型的变量,但要确保XML不是以声明
utf-8
开头的。如果您将XML作为文本,最好在字符串前面添加一个
N
,以获得
unicode
(声明@myXML NVARCHAR(MAX)=N'some XML here')我是新来的,有没有可能分享您的反馈或评级please@Priya分享你的反馈或评价是什么意思?哇!!!这是超级冷,我会检查和更新。关于magic word,它是java前端下拉列表的一部分。非常感谢。顺便问一下,有没有办法通过将xml读取为字符串来完成这项工作。刚刚进来case@Priya,很高兴帮助你!如果您喜欢,请在答案投票计数器下方的接受检查上打勾。关于将XML读取为字符串:只要字符串包含有效的XML,就可以通过
DECLARE@XML=(选择CAST(@SomeValidXML as XML))
来完成。最好使用
NVARCHAR
类型的变量,但要确保XML不是以声明
utf-8
开头的。如果您将XML作为文本,最好在字符串前面添加一个
N
,以获得
unicode
(声明@myXML NVARCHAR(MAX)=N'some XML here')我是新来的,有没有可能分享您的反馈或评级please@Priya分享你的反馈或评价是什么意思?