我希望有人可以提供建议或帮助。我有一些来自客户端的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"
。
有人可以帮忙吗?
答案 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]