Sql server 使用动态表中的列名的动态透视
我正在与SSRS和罗克韦尔软件公司的RSView32合作一个项目。基本上,此软件项目将制造数据记录到各个表中,如下所示: 一个表(Machine1_TagTable)具有标记名,这些标记名将数据描述为:标记名、标记索引。该名称为第二个表中包含的信息提供了一个人类可以理解的引用。示例:零件号,1 第二个表(Machine1_FloatTable)包含的原始数据只包含时间戳、标记索引和值。 示例:2013-12-10 15:44:11.322,112345(值) 我有一个适用于一张桌子的动态轴;但是,我想使用从SSRS传递的变量参数来选择标记表和浮动表 这可以作为动态语句的一部分使用Machine1_FloatTable,但不能在XML路径构建中使用。我知道这是一个范围问题,所以我正在寻找创造性的方法,允许我将表名从SSR传递到这个存储过程中 以下是我现在拥有的: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(值) 我有一个适用于一张桌子的动态轴;但是
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执行它。