【发布时间】:2017-12-15 16:50:13
【问题描述】:
你们上次帮了大忙,我对 SQL Server 中的 XML 越来越熟悉了,但我还是个新手。
我最近的挑战是我的节点名称相同,最多 50 次,并且只有一个数字来区分它们:
<QuoteHeaderXML>
<QuoteHeaderData>
<QuoteHeader>
<Configurable01 Value="" Name="Credit Memo" />
<Configurable02 Value="" Name="Contact Person" />
<Configurable04 Value="N/A" Name="Fed Ex Rated" />
<Configurable05 Value="Not Branded" Name="Branding" />
<Configurable06 Value="100%" Name="Project Status" />
<Configurable07 Value="" Name="Project Name" />
<Configurable08 Value="None" Name="Project Manager" />
<Configurable09 Value="" Name="Shipping Notes" />
<Configurable10 Value="False" Name="High Profile Order" />
<Configurable11 Value="New Construction" Name="Project Type" />
<Configurable12 Value="Single-family" Name="Channel" />
<Configurable13 Value="US - Texas - Northern" Name="Job Location" />
<Configurable20 Value="Dealer Warehouse" Name="Delivery Destination" />
</QuoteHeader>
</QuoteHeaderData>
</QuoteHeaderXML>
因此,如果我想提取 ConfigurableNN、名称和值的列,我必须编写这 50x 以将它们全部拉入它们存在的单独行中……或者为 50 个中的每一个调用每个最终在 150 多列表格中!我不喜欢这些选项。
相反,我希望编写代码来一次提取 ConfigurableNN、名称和值,但让它根据计数器动态更改节点的数量。但是,我看不到这样做,因为它抱怨 “XML 数据类型方法“值”的参数 1 必须是字符串文字。”。
这是我从我发现但无法工作的帖子中尝试和解决的问题......有任何建议还是这不可能?
WHILE @ConfigCounter <= 50
BEGIN
SET @CfgNum = case when @ConfigCounter < 10 then '0' else '' end + cast(@ConfigCounter as varchar(2));
select t.x.value('(Configurable'+cast(@CfgNum as varchar(2))+'/@Name)[1]','varchar(255)') ConfigurableFieldName
,t.x.value('(Configurable'+cast(@CfgNum as varchar(2))+'/@Value)[1]','varchar(255)') ConfigurableFieldValue
from @XMLData.nodes('//QuoteHeaderXML/QuoteHeaderData/QuoteHeader') as T(X)
where t.x.value('(Configurable'+cast(@CfgNum as varchar(2))+'/@Value)[1]','varchar(255)') is not null
SET @ConfigCounter = @ConfigCounter + 1;
END
提前感谢您的帮助、提示和/或想法! =)
【问题讨论】:
-
XML 的
.value()中的部分必须是文字。您的方法适用于动态创建的语句和EXEC,但这是纯粹的程序性思维,没有必要......
标签: sql-server xml