SQL 将 XML 转换为表
在SQL 2005中,有没有办法将以下xml转换为表?
<root>
<r>
<data>"col1"</data>
<data>"col2"</data>
<data>"col3"</data>
</r>
<r>
<data>"data1"</data>
<data>""</data>
<data>"data3"</data>
</r>
<r>
<data>"data"</data>
<data>"data"</data>
<data>"data"</data>
</r>
</root>
我希望输出为
col1 col2 col3
----------------
data data3
data data data
xml 可以有不同数量的列,因此解决方案需要考虑到这一点。
提前致谢。
In SQL 2005, is there a way to convert the following xml into a table?
<root>
<r>
<data>"col1"</data>
<data>"col2"</data>
<data>"col3"</data>
</r>
<r>
<data>"data1"</data>
<data>""</data>
<data>"data3"</data>
</r>
<r>
<data>"data"</data>
<data>"data"</data>
<data>"data"</data>
</r>
</root>
I want the output to be
col1 col2 col3
----------------
data data3
data data data
The xml can have different number of columns so the solution needs to account for this.
Thanks in advance.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
由于我在这里使用动态 SQL,因此建议阅读动态 SQL 的诅咒和祝福 。
对正在发生的事情的解释。
此查询用于从第一个
r
节点获取列名称:/root/r[1]
确保我们获取第一行。row_number()
枚举在数字和列名之间建立连接的列。@SQL 中的结果查询如下:
/root/r[position()>1]
获取除第一个节点之外的所有r
节点。data[1]
中的1
来自row_number()
,[col1]
来自相应的列名称。quotename()
将方括号[]
添加到列别名中。如果没有quotename()
,此查询可用于 SQL 注入。replace()
用于从字符串中删除"
。它将删除所有出现的"
,所以如果您期望" 作为值的一部分,您可以使用
substring()
来删除"
。我使用
varchar(10)
作为列数据的大小。您应该将其修改为您需要的任何内容。Since I use dynamic SQL here it is appropriate to suggest reading The Curse and Blessings of Dynamic SQL.
An explanation of what is going on.
This query is used to get the columns names from the first
r
node:/root/r[1]
makes sure we get the first row.row_number()
enumerates the columns making a connection between a number and the column name.The resulting query in @SQL is this:
/root/r[position()>1]
gets allr
nodes except the first one. The1
indata[1]
comes fromrow_number()
and[col1]
comes from the corresponding column name.quotename()
adds the brackets[]
to the column alias. Withoutquotename()
this query could be used for SQL injection.replace()
is used to remove"
from the string. It will remove all occurrences of"
so if you expect"
to be part of a value you could usesubstring()
to remove"
instead.I have used
varchar(10)
as the size of column data. You should modify that to whatever you need.列数不可变:SQL 通常是固定列
但是,您可以在某种程度上预见到这一点。
默认情况下也无法保证节点顺序评估,这使得提取第一行列名称变得复杂。
基于这个答案:http://stackoverflow.com/q/1134075/27535,你可以使用这个SQL来识别第1行
Not with a varying number of columns: SQL in general is fixed column
However, you can anticipate this somewhat
There is also no guarantee of node order evaluation by default which complicates extracting the first row column names.
Based on this answer:http://stackoverflow.com/q/1134075/27535, you can use this SQL to identify row 1
我从来没有这样做过,但我知道它可以做到......
看看这个教程,它似乎非常接近你所要求的。
http://weblogs.sqlteam.com/mladenp/archive/2007 /06/18/60235.aspx
I've never done it, but I know it can be done...
Take a look at this tutorial, it seems to be pretty close to exactly what you're asking for.
http://weblogs.sqlteam.com/mladenp/archive/2007/06/18/60235.aspx