【问题标题】:Creating SQL Columns from XML Attribute values从 XML 属性值创建 SQL 列
【发布时间】:2017-09-03 20:10:05
【问题描述】:

我希望有人可以提供建议或帮助。我有一些来自客户端的 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 列的表,第一个标题为“FName”,值为 "Johnny",第二个标题为“ProdRng”,其值为 "ABC"。

有人可以帮忙吗?

【问题讨论】:

  • 如果你正在做一些数据集成的东西,你需要像 Pentaho、SSMA 这样的数据集成工具。它们可以让您更好地了解您的数据源,您也可以在自己的开发环境中做到这一点,但您需要非常仔细地分析您的数据源。
  • 首先edit您的问题并用您正在使用的RDBMS(SQL Server、Oracle或PostgreSQL,...)标记它。然后删除 SQL 标记,因为答案可能不符合 ANSI SQL。

标签: sql xml


【解决方案1】:

如果可以使用 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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多