我一直试图编写这个查询,但到目前为止,没有结果。
以下是Server中XML列的部分数据:
<DashboardWidgets>
<DashboardWidget id="14">
<EnumName>PersonalProgressIndividual</EnumName>
<OnOff>1</OnOff>
<Movable>0</Movable>
<Removable>0</Removable>
<SubItemData>
<SubItem id="1">
<OnOff>1</OnOff>
<Movable>1</Movable>
<Removable>1</Removable>
</SubItem>
<SubItem id="2">
<OnOff>1</OnOff>
<Movable>1</Movable>
<Removable>1</Removable>
</SubItem>
<SubItem id="3">
<OnOff>1</OnOff>
<Movable>1</Movable>
<Removable>1</Removable>
</SubItem>
<SubItem id="4">
<OnOff>0</OnOff>
<Movable>0</Movable>
<Removable>0</Removable>
</SubItem>
<SubItem id="6">
<OnOff>0</OnOff>
<Movable>0</Movable>
<Removable>0</Removable>
</SubItem>
</SubItemData>
</DashboardWidget>
</DashboardWidgets>我的目标是查询表并检索ID和值的格式化字符串。
例如,我需要查询ID为14的DashboardWidget节点,并从包含在其中的SubItemData子节点构建字符串。
查询ID为14的仪表板小部件所需的字符串结果是:
"1,1,1,1|2,1,1,1|3,1,1,1|4,0,0,0|6,0,0,0"我能够通过提取所有的值来接近,但是根本没有任何分隔符。
DECLARE
@companyID INT = 23
,@dwID INT = 14
;
DECLARE @xml xml
SELECT @xml = c.DashboardWidgetSettings FROM dbo.Company c WHERE c.CompanyID = @companyID;
SELECT
x.Rec.query('./SubItem').value('.', 'varchar(max)') AS 'SubItemData'
FROM @xml.nodes('/DashboardWidgets/DashboardWidget[@id=sql:variable("@dwID")]/SubItemData') as x(Rec)
;任何帮助或指向正确方向的点都将不胜感激。
发布于 2017-04-03 21:46:13
Declare @XML xml = '<DashboardWidgets><DashboardWidget id="14"><EnumName>PersonalProgressIndividual</EnumName><OnOff>1</OnOff><Movable>0</Movable><Removable>0</Removable><SubItemData><SubItem id="1"><OnOff>1</OnOff><Movable>1</Movable><Removable>1</Removable></SubItem><SubItem id="2"><OnOff>1</OnOff><Movable>1</Movable><Removable>1</Removable></SubItem><SubItem id="3"><OnOff>1</OnOff><Movable>1</Movable><Removable>1</Removable></SubItem><SubItem id="4"><OnOff>0</OnOff><Movable>0</Movable><Removable>0</Removable></SubItem><SubItem id="6"><OnOff>0</OnOff><Movable>0</Movable><Removable>0</Removable></SubItem></SubItemData></DashboardWidget></DashboardWidgets>'
Select Stuff((Select Distinct '|' +String
From (
Select String = f.n.value('@id','varchar(50)')
+','
+f.n.value('(OnOff)[1]','varchar(50)')
+','
+f.n.value('(Movable)[1]','varchar(50)')
+','
+f.n.value('(Removable)[1]','varchar(50)')
From @XML.nodes('DashboardWidgets/DashboardWidget/SubItemData') t(n)
Cross Apply t.n.nodes('SubItem ') f(n)
) X
For XML Path ('')),1,1,'')返回
1,1,1,1|2,1,1,1|3,1,1,1|4,0,0,0|6,0,0,0https://stackoverflow.com/questions/43194296
复制相似问题