动态别名XML子节点

时间:2018-12-26 21:52:00

标签: sql sql-server xml

我在SQL Server 2012中具有HTML表生成功能,用于通过电子邮件将自定义报告发送给各种用户。该函数会馈送一个XML文件,该文件是从SQL语句生成的,该SQL语句使用已知标记为所有列加上别名。

SELECT
 T.Name AS [TD],
 T.Balance AS [TD],
 T.DateDue AS [TD],
FROM myTable T
For XML raw('TR'), Elements

然后,电子邮件功能将解析这些标签并使它们与HTML兼容。所有这些都工作正常,但是这种方法存在一些问题。

  1. 每当需要生成电子邮件时,都需要以这种方式别名化传递给函数的SQL。
  2. 数据所代表的内容(即原始SQL的列标题)已丢失给最终用户(除非在附加步骤中,电子邮件功能允许用户传递一个单独的逗号分隔变量来创建标题)列)

    我想做的是给任何SQL语句,使用已知数量自动对XML列进行别名(例如,标记,同时捕获列标题,最后将这些详细信息传递给email函数。这样做的目的是使过程更健壮,所需的设置更少。

我知道我可以通过遍历各列并使用REPLACE来完成这项工作,但是我真的很想在没有光标的情况下完成这项工作。另外,我可以两次运行SQL语句...呃。

我遇到的每个别名节点示例都依赖显式命名每个节点。在我的实例中,这不起作用。

所以我要问的是:给定未知的SQL语句,可以在生成XML之后为XML节点赋予别名吗?

CREATE TABLE #myTable (
    Name VARCHAR(30),
    Balance FLOAT,
    DateDue DATETIME
    )

INSERT INTO #myTable
VALUES ('John','123.45','12/31/2018'),('Wendy','321.45','12/31/2018'),('Paul','456.43','1/1/2019')

select * from #myTable

DECLARE @SQLInput NVARCHAR(MAX)

SELECT @SQLInput= 
'SELECT
 T.Name,
 T.Balance,
 T.DateDue
FROM #myTable T'

----------------
--parsing

DECLARE @ColumnHeads VARCHAR(MAX)=NULL,
        @SQL NVARCHAR(MAX)=NULL,
        @XML XML,
        @ParameterDef NVARCHAR(1024)=N'@pXML XML OUTPUT'

SET @SQL=N'SELECT @pXML = (' + @SqlInput + ' FOR XML RAW(''TR''),Elements)'

EXECUTE sp_executeSQL
    @SQL,
    @ParameterDef,
    @pXML=@XML OUTPUT


SELECT @ColumnHeads=COALESCE(@ColumnHeads + ',', '') + NodeName FROM (
SELECT DISTINCT
    NodeName = C.value('local-name(.)', 'varchar(50)')
FROM @XML.nodes('/TR/*') AS T(C))HDR

Select @XML

Select @ColumnHeads

0 个答案:

没有答案