【问题标题】:Converting Every Child Tags in to a Single Column with multiple Delimiters -SQL Server (2)将每个子标记转换为具有多个分隔符的单列-SQL Server(2)
【发布时间】:2017-06-11 06:37:44
【问题描述】:
declare @xml xml='<plan>
    <prescriptions id="1">
        <prescription>
            <name>ABC</name>
            <frequency>Daily</frequency>
            <dailyfrequency>
               <morning>2</morning>
               <afternoon></afternoon>
               <night>1</night>
            </dailyfrequency>
            <dayfrequency></dayfrequency>
        </prescription>
        <prescription>
            <name>EDF</name>
            <frequency>Daily</frequency>
            <dailyfrequency>
              <morning>5</morning>
              <afternoon>5</afternoon>
              <night>1</night>
           </dailyfrequency>
           <dayfrequency></dayfrequency>
        </prescription>
        <prescription>
            <name>YTER</name>
            <frequency>Weekly</frequency>
            <dailyfrequency>
              <morning>5</morning>
              <afternoon>5</afternoon>
              <night>1</night>
            </dailyfrequency>
            <dayfrequency>Monday,Tuesday,Wednesday</dayfrequency>
        </prescription>
    </prescriptions>
    <prescriptions id="2">
        <prescription>
            <name>YTRE</name>
            <frequency>Daily</frequency>
            <dailyfrequency>
               <morning>2</morning>
               <afternoon></afternoon>
               <night>1</night>
            </dailyfrequency>
            <dayfrequency></dayfrequency>
          </prescription>
    </prescriptions>
</plan>'

我们可以像下面这样查询,用多个分隔符将每个元素分隔到同一列中。

SELECT STUFF(
(
    SELECT '!' + STUFF(p.query(N'for $n in .//*[local-name()!="dailyfrequency"]
                           return <a>{concat("$",($n/text())[1])}</a>'
                        ).value(N'.',N'nvarchar(max)'),1,1,'')
    FROM @xml.nodes(N'/plan/prescriptions/prescription') AS A(p)
    FOR XML PATH(''),TYPE).value(N'.',N'nvarchar(max)'),1,1,'')

结果:

ABC$Daily$2$$1$!EDF$Daily$5$5$1$!YTER$Weekly$5$5$1$Monday,Tuesday,Wednesday!YTRE$Daily$2$$1$

但这里的问题是这会将所有标签组合在一个列下。当我们查看 xml 时,它有 2 个主要分区 Prescription id=1 和 prescritpion id=2。所以我们的最终结果将是这样的

结果:

ABC$Daily$2$$1$!EDF$Daily$5$5$1$!YTER$Weekly$5$5$1$Monday,Tuesday,Wednesday
YTRE$Daily$2$$1$

我认为我们必须为每个 Prescriptions> 切碎 Xml,然后必须计算这个

有人能解决这个问题吗

提前致谢,Jayendran

【问题讨论】:

    标签: sql-server xml tsql xpath xquery


    【解决方案1】:

    像这样更改您的查询:

    SELECT STUFF(
    (
        SELECT '!' + STUFF(p.query(N'for $n in .//*[local-name()!="dailyfrequency"]
                               return <a>{concat("$",($n/text())[1])}</a>'
                            ).value(N'.',N'nvarchar(max)'),1,1,'')
        FROM p.nodes(N'prescription') AS A(p)
        FOR XML PATH(''),TYPE).value(N'.',N'nvarchar(max)'),1,1,'')
    FROM @xml.nodes(N'/plan/prescriptions') AS A(p);
    

    首先我们为不同的处方创建一个派生表,其次我们为每个处方分别使用以前的代码。

    【讨论】:

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