Sql server 使用动态表中的列名的动态透视

Sql server 使用动态表中的列名的动态透视,sql-server,xml,dynamic,reporting-services,pivot,Sql Server,Xml,Dynamic,Reporting Services,Pivot,我正在与SSRS和罗克韦尔软件公司的RSView32合作一个项目。基本上,此软件项目将制造数据记录到各个表中,如下所示: 一个表(Machine1_TagTable)具有标记名,这些标记名将数据描述为:标记名、标记索引。该名称为第二个表中包含的信息提供了一个人类可以理解的引用。示例:零件号,1 第二个表(Machine1_FloatTable)包含的原始数据只包含时间戳、标记索引和值。 示例:2013-12-10 15:44:11.322,112345(值) 我有一个适用于一张桌子的动态轴;但是

我正在与SSRS和罗克韦尔软件公司的RSView32合作一个项目。基本上,此软件项目将制造数据记录到各个表中,如下所示:

一个表(Machine1_TagTable)具有标记名,这些标记名将数据描述为:标记名、标记索引。该名称为第二个表中包含的信息提供了一个人类可以理解的引用。示例:零件号,1

第二个表(Machine1_FloatTable)包含的原始数据只包含时间戳、标记索引和值。 示例:2013-12-10 15:44:11.322,112345(值)

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

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

以下是我现在拥有的:

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)

如有任何帮助或建议,将不胜感激。谢谢

如果我理解你的问题,这是可能的。您必须构建一个动态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

它很粗糙,但我认为应该有用。

谢谢,安德鲁。我之前曾尝试过这样做,但显然在引用转义方面存在问题。查询现在执行时没有错误,但只返回第一个结果集(@cols)。转义引号非常困难。我没有把你剩下的代码包括在我的代码里。您应该能够按照上面的方式构建@query变量,然后使用sp_executesql执行它。