【问题标题】:Converting Every Child Tags in to a Single Column with multiple Delimiters -SQL Server (3)将每个子标记转换为具有多个分隔符的单列-SQL Server(3)
【发布时间】:2017-06-13 07:25:02
【问题描述】:

我的 xml:

declare @x xml='<Detail>
    <ROll ID="1">
         <Exams>
                <Examdetails date="2017-04-02 13:30:00">
                  <Exam name="ECO" Total="100">150</Exam>
                  <Exam name="BIO" Total="150">50</Exam>
                  <Exam name="MATH" Total="200">28</Exam>
                </Examdetails>

                <Examdetails date="2017-04-02 14:30:00">
                  <Exam name="ENGLISH" Total="100">150</Exam>
                  <Exam name="BIO" Total="200">50</Exam>
                  <Exam name="ZIO" Total="250">28</Exam>
                </Examdetails>
         </Exams>
    </ROll> 
    <ROll ID="2">
         <Exams>
                <Examdetails date="2017-05-02 13:30:00">
                  <Exam name="HIS" Total="100">150</Exam>
                  <Exam name="BIO" Total="200">50</Exam>
                  <Exam name="THI" Total="200">89</Exam>
                </Examdetails>
         </Exams>
    </ROll>
</Detail>'

当我尝试使用here 引用的以下查询时,我想根据 ROLL ID 隔离我的 xml

SELECT STUFF(
(
    SELECT '!' + STUFF(p.query(N'for $n in .//*
                           return <a>{concat("$",($n/text())[1])}</a>'
                        ).value(N'.',N'nvarchar(max)'),1,1,'')
    FROM p.nodes(N'Exams') AS A(p)
    FOR XML PATH(''),TYPE).value(N'.',N'nvarchar(max)'),1,1,'')
FROM @x.nodes(N'Detail/ROll') AS A(p);

我得到的结果是

但我想将其查询为

2017-04-02 13:30:00$ECO$100$150!2017-04-02 13:30:00$BIO$150$50!2017-04-02 13:30:00$MATH$200$28!2017-04-02 14:30:00$ENGLISH$100$150!2017-04-02 14:30:00$BIO$200$50!2017-04-02 14:30:00$ZIO$250$28
2017-05-02 13:30:00$HIS$100$150!2017-05-02 13:30:00$BIO$200$50!2017-05-02 13:30:00$THI$200$89

请帮我解决这个复杂问题

提前致谢,贾延德兰

【问题讨论】:

    标签: sql-server xml tsql xpath xquery


    【解决方案1】:

    在这种情况下,我会留下通用路径并像这样构建它:

    SELECT r.value(N'@ID',N'int') AS ROll_ID
    ,STUFF((
        SELECT 
               (
               SELECT '!'+ed.value(N'@date',N'nvarchar(max)')
                     +'$' + e.value(N'@name','nvarchar(max)')
                     +'$' + e.value(N'@Total','nvarchar(max)')
                     +'$' + e.value(N'text()[1]','nvarchar(max)')
               FROM ed.nodes(N'Exam') AS D(e)
               FOR XML PATH(''),TYPE
               ).value(N'text()[1]','nvarchar(max)')  
        FROM ex.nodes(N'Examdetails') AS C(ed)
        FOR XML PATH(''),TYPE
    ).value(N'text()[1]','nvarchar(max)'),1,1,'')
    FROM @x.nodes(N'/Detail/ROll') AS A(r)
    CROSS APPLY r.nodes(N'Exams') AS B(ex);
    

    通用解决方案可能不起作用的主要问题:

    • 属性和元素的text()一般很难混用
    • 重要!)不保证属性顺序!属性值的显示顺序可能与预期不符...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-22
      • 2021-07-03
      • 1970-01-01
      • 2017-04-29
      • 1970-01-01
      相关资源
      最近更新 更多