Sql server 添加xml节点的SQL字符串操作
我使用的是sql 2008R2,表中有xml列,如-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>
<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分享你的反馈或评价是什么意思?