动态数据透视表,包含动态表中的列名称

时间:2013-12-10 19:58:05

标签: sql-server xml dynamic reporting-services pivot

我正在与SSRS和Rockwell Software的RSView32合作开展一个项目。基本上,这个软件项目将制造数据记录到各个表中:

一个表(Machine1_TagTable)具有标记名称,用于描述数据:TagName,TagIndex。该名称为第二个表中包含的信息提供了人类可理解的参考。示例:零件号,1

第二个表(Machine1_FloatTable)包含的原始数据只有一个时间戳,TagIndex和value。 示例:2013-12-10 15:44:11.322,1,12345(价值)

我有一个适用于一张桌子的动态轴;但是,我想使用从SSRS传递的变量参数来选择TagTable和FloatTable。

这适用于Machine1_FloatTable作为动态语句的一部分,但不适用于XML路径构建。我知道这是一个范围问题,所以我正在寻找创造性的方法来允许我将SSRS中的表名传递给这个存储过程。

这就是我现在所拥有的:

DECLARE @FLOATTABLE NVARCHAR(MAX), @TAGTABLE NVARCHAR(MAX), @startdate NVARCHAR(MAX), 
@enddate NVARCHAR(MAX), @cols as NVARCHAR(MAX), @query as NVARCHAR(MAX)

SET @TAGTABLE ='dbo.Machine1_TagTable'
SET @FLOATTABLE = 'dbo.Machine1_FloatTable'


SELECT @cols = STUFF((SELECT DISTINCT ',' +  QUOTENAME(CONVERT(VARCHAR,TagName),'"')
FROM @tagtable
FOR XML PATH('')),1,1,'')


Set @query = 'SELECT  DISTINCT DateAndTime, Millitm,  ' + @cols + ' FROM ( select
T.DateAndTime, T.Millitm, N.TagName, T.Val from ' + @FLOATTABLE + ' T  LEFT JOIN ' +
@TAGTABLE + ' N ON T.TagIndex=N.TagIndex WHERE T.DateAndTime Between '''+ @startdate +
'''     AND '''+ @enddate +''')  x PIVOT (MAX(Val) for TagName IN (' + @cols + ')) p'

PRINT (@query)

非常感谢任何帮助或建议。谢谢!

1 个答案:

答案 0 :(得分:0)

嗯,如果我理解你的问题,那是可能的。您必须构建一个动态SQL字符串,并执行该字符串以填充@cols。

declare @string nvarchar(MAX)

set @String = 'SELECT STUFF((SELECT  DISTINCT   '','' +  QUOTENAME(CONVERT(VARCHAR,ActualDate),' 
    + '''"'') FROM ' + @TAGTABLE + ' FOR XML PATH ('''')),1,1,'''')'


EXECUTE sp_executeSQL @String, @Cols OUTPUT

print @cols

这很糟糕,但我认为它应该有用。