我在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兼容。所有这些都工作正常,但是这种方法存在一些问题。
数据所代表的内容(即原始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