首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于存储在列中的数据构建字符串

基于存储在列中的数据构建字符串
EN

Stack Overflow用户
提问于 2017-04-03 21:08:10
回答 1查看 43关注 0票数 0

我一直试图编写这个查询,但到目前为止,没有结果。

以下是Server中XML列的部分数据:

代码语言:javascript
复制
<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的仪表板小部件所需的字符串结果是:

代码语言:javascript
复制
"1,1,1,1|2,1,1,1|3,1,1,1|4,0,0,0|6,0,0,0"

我能够通过提取所有的值来接近,但是根本没有任何分隔符。

代码语言:javascript
复制
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)
;

任何帮助或指向正确方向的点都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-03 21:46:13

代码语言:javascript
复制
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,'')

返回

代码语言:javascript
复制
1,1,1,1|2,1,1,1|3,1,1,1|4,0,0,0|6,0,0,0
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43194296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档