我正在与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)
非常感谢任何帮助或建议。谢谢!
答案 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
这很糟糕,但我认为它应该有用。