2011-08-16 18 views
2

我试图转换数据库表行的一个中柱,并使用游标旋转功能,这里将行数据中列是SQL:SQL使用单台

DECLARE Cur CURSOR FOR 
    SELECT DISTINCT CounterId 
    FROM AllCounterIds 

DECLARE @Temp NVARCHAR(MAX), 
    @AllCounterIds NVARCHAR(MAX), 
    @CounterIdQuery NVARCHAR(MAX) 

SET @AllCounterIds = '' 

OPEN Cur 
-- Getting all the movies 
FETCH NEXT FROM Cur INTO @Temp 
WHILE @@FETCH_STATUS = 0 
BEGIN 
SET @AllCounterIds = @AllCounterIds + '[' + @Temp + '],' 
FETCH NEXT FROM Cur INTO @Temp 
END 

CLOSE Cur 
DEALLOCATE Cur 

SET @AllCounterIds = SUBSTRING(@AllCounterIds, 0, LEN(@AllCounterIds)) 

SET @CounterIdQuery = 'SELECT DateTime, ' + @AllCounterIds + ' 
FROM 
(SELECT Type, DateTime, Value, AllCounterIds.CounterId 
FROM AllCounterIds 
INNER JOIN AllCounters 
    ON AllCounterIds.CounterId = AllCounters.CounterId) S 
PIVOT 
(
SUM (Value) 
FOR CounterId IN 
(' + @AllCounterIds + ')) AS pvt' 

EXEC sp_executesql @CounterIdQuery 

其中AllCounterIds是查看我创建使用此:

GO 
CREATE VIEW AllCounterIds AS 
SELECT DISTINCT CounterId FROM AllCounters 
GO 

所以问题是,我身边有27993600行表现在为止,当我执行的SQL需要arount 4分钟和大约15秒给我的输出和每场演出要求它的坏...所以我的问题是,无论如何,我可以实现我的愿望ed结果但获得更好的表现?

而只是为了让你知道簇索引的表中还定义...

+0

我假设你已经在这个查询上运行sql profiler? –

+0

没有得到你的观点...你能解释更多,并提供一些替代? –

回答

2

我不知道它实际上是更快地为你的情况,但也许尝试这样

declare 
    @allcounterids varchar(max), 
    @counteridquery varchar(max) 
; 

select 
    @allcounterids = stuff((
    select 
      '],[' + cast([CounterId] as varchar(32)) 
     from 
      allcounterids 
     for xml path('')), 1, 2, '') + ']' 
; 

set @counteridquery = 'select 
     s.datetime, pvt.* 
    from 
     (SELECT Type, DateTime, Value, AllCounterIds.CounterId 
      FROM AllCounterIds 
      INNER JOIN AllCounters 
       ON AllCounterIds.CounterId = AllCounters.CounterId 
     ) S 
     PIVOT 
     (
      SUM (Value) 
      FOR CounterId IN 
      (' + @AllCounterIds + ') 
     ) AS pvt;' 
; 
execute(@counteridquery); 

东西故意使用varchar而不是nvarchar。这是不可能的,你需要 unicode的整数列表,它会节省一些内存,因此可能时间。

+0

在运行时出现以下错误,错误 - >多部分标识符“s.datetime”无法绑定。 –

+0

@dvlpr:这只是一个例子,可能不能直接运行。无论如何,从最后的'set'语句是你的代码,而不是我的。如果我的版本损坏,请直接使用你的版本。有趣的区别只在于数据透视表的构建方式。 – Sorpigal

+0

需要使用nvarchar是我使用的过程的要求...试图使其作为varchar,但给出了一个错误,说它只能是下面的一种ntext/nchar/nvarchar –