从XML属性值创建SQL列

时间:2017-08-29 16:21:53

标签: sql xml

我希望有人可以提供建议或帮助。我有一些来自客户端的XML(非常格式化,我不得不说),我想从XML元素中提取一些属性,将该属性的值创建为列,然后使用相应的值填充该列来自节点。 因此,例如下面,提取nField属性值,然后为其指定相应的<value>

<root>
<entry dType="TXT" bMark="Name" nField="FName">
     <value>Johnny</value>
</entry>
<entry dType="TXT" bMark="Product" nField="ProdRng">
     <value>ABC</value>
</entry>

...等

导致一个包含2列的表格,第一个标题是&#34; FName&#34;值为"Johnny",第二个标题为&#34; ProdRng&#34;及其价值"ABC"

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

如果可以使用SQL Server;使用动态SQL的解决方案是:

declare @sql nvarchar(max), @txt nvarchar(max) = 
'<root>
<entry dType="TXT" bMark="Name" nField="FName">
     <value>Johnny</value>
</entry>
<entry dType="TXT" bMark="Product" nField="ProdRng">
     <value>ABC</value>
</entry>
</root>';

with t as (
    select cast(@txt as xml) as x
), columnsInfo as (
    select 
        tx.c.value('@nField', 'nvarchar(20)') columnName,
        tx.c.value('@dType', 'nvarchar(20)') columnType,
        tx.c.value('./value[1]', 'nvarchar(20)') columnValue
    from t
    cross apply t.x.nodes('/root/entry') tx(c)
)
select 
    @sql = 
        case when @sql is null then 
            'create table [t' + cast(newid() as nvarchar(40)) + '] ('
            -- I use `newid()` for name of table to avoid duplicate
        else 
            @sql + ','
        end + ' [' + columnName + '] ' +
        case when columnType = 'TXT' then
            'nvarchar(255)'
        else
            '[int]'
        end +
        ' null'
from columnsInfo;

set @sql = @sql + ') on [primary]';

exec sp_sqlexec @sql;

SQL命令将是:

create table [t3C34CC17-CE06-483E-960E-F8C5E31478AE] ( [FName] nvarchar(255) null, [ProdRng] nvarchar(255) null) on [primary]

[SQL Fiddle Demo]