簡體   English   中英

基於存儲在SQL Server XML列中的數據構建字符串

[英]Build String Based on Data Stored in SQL Server XML Column

我一直在嘗試編寫此查詢,但到目前為止沒有任何結果。

以下是SQL 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)
;

任何幫助或朝着正確方向的觀點將不勝感激。

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,0

暫無
暫無

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

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