【问题标题】:TSQL For XML JSON AUTO generates a flat result with using CTE with UNIONTSQL For XML JSON AUTO 使用 CTE 和 UNION 生成平面结果
【发布时间】:2020-06-05 15:25:46
【问题描述】:

对于下面的 TSQL,期望是生成和输出 COL 嵌套在 T 中的位置,但返回一个平面结果。

With FilteredTables as (
    select * from INFORMATION_SCHEMA.TABLES
    union
    select * from INFORMATION_SCHEMA.TABLES -- Repeated just to show the issue
)
select T.TABLE_SCHEMA, T.TABLE_NAME,
    COL.COLUMN_NAME, --as "columns.name",
    COL.DATA_TYPE --as "columns.type"
    from FilteredTables T
    INNER JOIN INFORMATION_SCHEMA.COLUMNS COL
        on T.TABLE_SCHEMA = COL.TABLE_SCHEMA
        and T.TABLE_NAME = COL.TABLE_NAME
--order by [Schema], [Table]
FOR XML Auto

当从 FilteredTables CTE 中删除联合时,它会按预期工作

这是一个 SQL 错误还是有什么好的理由?

【问题讨论】:

  • 看起来像一个带有错误,MS规范说'with' CTE就像'view',它允许联合——我猜它作为一个内联派生表工作?
  • 我的一般建议是:不要使用AUTO 模式...我永远不会依赖花哨的逻辑,它不受我的控制来神奇地创建所需的结构。几乎在任何情况下PATH 都是要走的路……至少对我来说……

标签: tsql union common-table-expression xml-formatting


【解决方案1】:

如果需要联合而不是使用FROM cte_name,请使用FROM (SELECT * FROM cte_name)

With FilteredTables as (
    select * from INFORMATION_SCHEMA.TABLES
    union
    select * from INFORMATION_SCHEMA.TABLES -- Repeated just to show the issue
)
select T.TABLE_SCHEMA, T.TABLE_NAME,
    COL.COLUMN_NAME, --as "columns.name",
    COL.DATA_TYPE --as "columns.type"
    from 
       -- Workaround  
       (SELECT * FROM FilteredTables) T

    INNER JOIN INFORMATION_SCHEMA.COLUMNS COL
        on T.TABLE_SCHEMA = COL.TABLE_SCHEMA
        and T.TABLE_NAME = COL.TABLE_NAME
--order by [Schema], [Table]
FOR XML Auto

【讨论】:

    猜你喜欢
    • 2017-08-13
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-05
    • 2011-08-10
    • 1970-01-01
    相关资源
    最近更新 更多