【问题标题】:Dynamic SQL error when using pivot command使用数据透视命令时出现动态 SQL 错误
【发布时间】:2017-01-24 04:07:36
【问题描述】:
IF OBJECT_ID('tempdb..#temp1') IS NOT NULL DROP TABLE #temp1
GO

CREATE TABLE #TEMP1 
(
  COUNTER nvarchar(200),SEQUENCE INT   
)
INSERT INTO #TEMP1 VALUES ('Counter1','1')
INSERT INTO #TEMP1 VALUES ('Counter2','2')
INSERT INTO #TEMP1 VALUES ('Counter3','3')
INSERT INTO #TEMP1 VALUES ('Counter4','4')
INSERT INTO #TEMP1 VALUES ('Counter5','5')
INSERT INTO #TEMP1 VALUES ('Counter6','6')
INSERT INTO #TEMP1 VALUES ('Counter7','7')
INSERT INTO #TEMP1 VALUES ('Counter8','8')
INSERT INTO #TEMP1 VALUES ('Counter9','9')
INSERT INTO #TEMP1 VALUES ('Counter10','10')

--select * from #TEMP1


DECLARE @query AS NVARCHAR(MAX)=''
DECLARE @Counter nvarchar(1000)
DECLARE @Cols As NVARCHAR(MAX)=''

declare  MyCursor cursor
for SELECT  DISTINCT A.SEQ
    FROM tblSEQUENCE A 
    open MyCursor
fetch next from MyCursor into @Counter
while @@FETCH_STATUS=0
BEGIN

    Set @Cols = @Cols + 'Counter'+@Counter+''   
    fetch next from MyCursor into @Counter
END
CLOSE MyCursor;  
DEALLOCATE MyCursor
set @Cols= stuff(@Cols,len(@Cols),1,'')
print @Cols

set @query = 'SELECT ' + @cols + ' FROM (select B.METER_VALUE As VALUE,A.SEQ AS SEQUENCE,T.COUNTER AS COUNTER
                    from tblCOUNTER B,tblSEQUENCE A INNER JOIN #TEMP1 T
                     ON A.SEQ=T.SEQUENCE)
                             x
            pivot 
            (
                max(VALUE)
                for COUNTER in (' + @cols + ')
            ) p '

--print @query
execute(@query)

我需要根据序列将最大值旋转到相应的计数器。

我的结果需要看起来像

Counter_1   Counter_2   Counter_3   Counter_4   Counter_5
29823       29823       29823       29823       29823

我怎样才能做到这一点?我经常收到错误太长。最大长度为 128

【问题讨论】:

  • 请使用代码格式化程序格式化您的代码,并粘贴您的确切错误消息。干杯!
  • 请添加示例数据以及tblSEQUENCE表的结构
  • Msg 103, Level 15, State 4, Line 1 以“Counter1Counter2Counter3Counter4Counter5Counter6Counter7Counter8Counter9Counter10”开头的标识符太长。最大长度为 128。我知道我指定的列已达到最大限制。但是如何更正这一点并为相同的值提供枢轴值呢?提前非常感谢
  • tblSequence 包含 SEQ 1-10。就是这样。谢谢
  • tblCOUNTER 表中有哪些值?

标签: mysql sql sql-server tsql


【解决方案1】:
IF OBJECT_ID('tempdb..#temp1') IS NOT NULL DROP TABLE #temp1
GO

CREATE TABLE #TEMP1 
(
COUNTER nvarchar(200),SEQUENCE INT   
)
INSERT INTO #TEMP1 VALUES ('Counter1','1')
INSERT INTO #TEMP1 VALUES ('Counter2','2')
INSERT INTO #TEMP1 VALUES ('Counter3','3')
INSERT INTO #TEMP1 VALUES ('Counter4','4')
INSERT INTO #TEMP1 VALUES ('Counter5','5')
INSERT INTO #TEMP1 VALUES ('Counter6','6')
INSERT INTO #TEMP1 VALUES ('Counter7','7')
INSERT INTO #TEMP1 VALUES ('Counter8','8')
INSERT INTO #TEMP1 VALUES ('Counter9','9')
INSERT INTO #TEMP1 VALUES ('Counter10','10')

--select * from #TEMP1


DECLARE @query AS NVARCHAR(MAX)=''
DECLARE @Counter nvarchar(1000)
DECLARE @Cols As NVARCHAR(MAX)=''
DECLARE @ColsName As NVARCHAR(MAX)=''

declare  MyCursor cursor
for SELECT  DISTINCT A.SEQ
FROM tblSEQUENCE A 
open MyCursor
fetch next from MyCursor into @Counter
while @@FETCH_STATUS=0
BEGIN

Set @Cols = @Cols + '[Counter'+ @Counter+'],' 
print @cols  

Set @ColsName = @ColsName + '[Counter' + @Counter + '] as Counter_'+ @Counter+',' 
print @ColsName  
fetch next from MyCursor into @Counter
END
CLOSE MyCursor;  
DEALLOCATE MyCursor
set @Cols= substring(@Cols,1,len(@Cols)-1)
print @Cols

set @ColsName= substring(@ColsName,1,len(@ColsName)-1)
print @ColsName


set @query = 'SELECT ' + @ColsName + ' FROM (select B.METER_VALUE As VALUE,A.SEQ AS SEQUENCE,T.COUNTER AS COUNTER
                from tblCOUNTER B inner join tblSEQUENCE A On B.seq=A.SEQ INNER JOIN #TEMP1 T
                 ON A.SEQ=T.SEQUENCE)
                         x
        pivot 
        (
            max(VALUE)
            for COUNTER in (' + @cols + ')
        ) p '

--print @query
execute(@query)

【讨论】:

  • 嗨,这个脚本没有抛出任何错误。但它运行了1个多小时。 @Suraz,由于我的 tblCounter 包含 100 列我无法在此处提供结构。所需的列如下。SEQ_Pkey Counter_Value 2 15006 3 178383 8 0 1 29641 1 77422 10 1663
  • 我什至打印查询并尝试在新选项卡中运行查询。它运行了很长时间,没有任何错误。
  • @LT268: 查询结果正确与否?我想您使用的 join 存在一些问题。
猜你喜欢
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 2014-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多