2017-02-17 51 views
1

我正在使用代码将特定数据从行转移到列,当我在小样本中使用它时,它工作正常,但对于约3.4百万行的原始样本它回答这样的:SQL Server 2016转置某些数据从行到列

消息511,级别16,状态1,2号线
无法创建大小36912的一排这比8060

允许的最大行尺寸更大(更详细信息:) SQL Server 2008: Rows into columns in a dynamic way "HELP" with the code

代码:

 declare @sql nvarchar(max); 
     declare @fields nvarchar(max); 

     set @fields=stuff((select ',['+column0+']' 
       from dll_ptbv 
       where column0 not in ('Code','Mnemonic') 
       group by column0 
       order by case when column0='Name' then 0 else 3 end 
       ,column0 
       for xml path('') 
       ,type 
       ).value('.','nvarchar(max)') 
       ,1 ,1 ,''); 
     [email protected]='select'[email protected] 
     + 'from (select column0 
         ,column1 
         ,sum(rn1*rn2) over(order by rn2) as rn 
       from (select column0 
          ,column1 
          ,case when column0=''Name'' then 1 else 0 end as rn1 
          ,row_number() over(order by (select null)) as rn2 
        from dll_ptbv 
        ) as a 
       ) as a 
    pivot (max(column1) for column0 in ('[email protected]+')) as p 
    order by [Name]'; 
     execute sp_executesql @sql; 

Small sample results

+0

你们是不是在任何地方插入你的结果是否可行? – GarethD

+0

你是什么意思“insert .. anywhere?” –

+0

我的意思是你将它们插入表格中(临时或永久)。这个错误通常是由于IN_ROW_DATA超过8kb而试图插入一行造成的。 – GarethD

回答

1

TL; DR解决方案是不是在你的脚本中使用order by

你的问题是你正在尝试排序一个超过8060字节的数据(source)。每个GROUP BY,ORDER

字节BY 8,060

我已经写了一些代码来试用你的事。

正如预期的那样,当我们注释掉order by [Name]

DROP TABLE IF EXISTS dll_ptbv 

CREATE TABLE dll_ptbv(
ID INT IDENTITY(1,1) 
,column0 NVARCHAR(MAX) 
,column1 NVARCHAR(MAX) 
) 

INSERT dll_ptbv VALUES ('Name', 'Very very company name') 

-- generate dates and insert into table 
DECLARE @start DATE, @end DATE; 
SELECT @start = '20000101', @end = '20021201'; 

;WITH n AS 
(
SELECT TOP (DATEDIFF(DAY, @start, @end) + 1) 
n = ROW_NUMBER() OVER (ORDER BY [object_id]) 
    FROM sys.all_objects 

) 
INSERT dll_ptbv 
SELECT DATEADD(DAY, n-1, @start), ABS(CAST(CAST(NEWID() AS VARBINARY) AS INT)) 
FROM n; 

SELECT TOP 10 * FROM dll_ptbv 

DECLARE @sql nvarchar(max); 
DECLARE @fields nvarchar(max); 

    set @fields=stuff((select ', ['+column0+']' 
      from dll_ptbv 
      where column0 not in ('Code','Mnemonic') 
      group by column0 
      order by case when column0='Name' then 0 else 3 end 
      ,column0 
      for xml path('') 
      ,type 
      ).value('.','nvarchar(max)') 
      ,1 ,1 ,''); 
    SET @sql='select'[email protected] 
    + 'from (select column0 
        ,column1 
        ,sum(rn1*rn2) over(order by rn2) as rn 
      from (select column0 
         ,column1 
         ,case when column0=''Name'' then 1 else 0 end as rn1 
         ,row_number() over(order by (select null)) as rn2 
       from dll_ptbv 
       ) as a 
      ) as a 
pivot (max(column1) for column0 in ('[email protected]+')) as p 
--order by [Name] 
'; 

    PRINT @SQL 
    EXECUTE sp_executesql @sql;