簡體   English   中英

從XML屬性值創建SQL列

[英]Creating SQL Columns from XML Attribute values

我希望有人能提供建議或幫助。 我有一個來自客戶端的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 ”, ProdRng"Johnny" ,第二個標頭為“ ProdRng ”及其值"ABC"

有人可以協助嗎?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM