Pregunta

I have a dynamic pivot table that produces an unknown number of columns until runtime. I am trying to clear the data out of an existing table and insert the results of my query into it. The problem that I am having is that I do not know what the table definition will be ahead of time because it is dynamic.

Here is the error I am getting:
Msg 213, Level 16, State 7, Line 1 Column name or number of supplied values does not match table definition.

The pivoted column is a date column which could have 1 date or 1000+ dates. How can I create a table definition that will match the data that I am trying to insert?

Here is my query:

 DECLARE @colsPivot AS NVARCHAR(MAX),
 @colsUnpivot AS NVARCHAR(MAX),
 @query AS NVARCHAR(MAX)

select @colsPivot = STUFF((SELECT ',' + QUOTENAME(rce.EcoDate) 
                             from PhdRpt.RptCaseEco_542 AS rce
                             group by rce.EcoDate
                             order by rce.EcoDate
                     FOR XML PATH(''), TYPE
                     ).value('.', 'NVARCHAR(MAX)') 
                     ,1,1,'')

SELECT @colsUnpivot = stuff((SELECT ','+quotename(C.name)
FROM sys.columns AS C
WHERE C.object_id = object_id('PhdRpt.RptCaseEco_542') AND
C.name in ('NDCash', 'DCash')--LIKE '%Cash' or C.Name like  'NetGas'
FOR xml path('')), 1, 1, '')

set @query 
 = 'select *
 --into ##hello
 from
 (
     SELECT  
        ReportRunCaseId,
        col, 
        EcoDate,  
        val
    FROM PhdRpt.RptCaseEco_542  
unpivot
(
val
for col in ('+ @colsunpivot +')
) u
 ) x1
 pivot
 (
     max(val)
     for EcoDate in ('+ @colspivot +')
 ) p'

truncate table dbo.Table1
insert into dbo.Table1
exec(@query)
¿Fue útil?

Solución

I would DROP original table and just create new one on the fly using SELECT INTO clause.

by using SELECT INTO you do not need to create table before hand or worry what type and how many columns it will have. SQL Server will just create it for you.

Note: this only works when table does not exists.

Full documentation on INTO Clause http://technet.microsoft.com/en-us/library/ms188029.aspx

as another alternative you can always SELECT INTO #temp table that you can drop or use it to model your other table but I think this is extra work that you do not want to do.

Otros consejos

You can do something like this:

 DROP TABLE dbo.Table1

 DECLARE @colsPivot AS NVARCHAR(MAX),
 @colsUnpivot AS NVARCHAR(MAX),
 @query AS NVARCHAR(MAX)

select @colsPivot = STUFF((SELECT ',' + QUOTENAME(rce.EcoDate) 
                             from PhdRpt.RptCaseEco_542 AS rce
                             group by rce.EcoDate
                             order by rce.EcoDate
                     FOR XML PATH(''), TYPE
                     ).value('.', 'NVARCHAR(MAX)') 
                     ,1,1,'')

SELECT @colsUnpivot = stuff((SELECT ','+quotename(C.name)
FROM sys.columns AS C
WHERE C.object_id = object_id('PhdRpt.RptCaseEco_542') AND
C.name in ('NDCash', 'DCash')--LIKE '%Cash' or C.Name like  'NetGas'
FOR xml path('')), 1, 1, '')

set @query 
 = 'select *
 into dbo.Table1
 from
 (
     SELECT  
        ReportRunCaseId,
        col, 
        EcoDate,  
        val
    FROM PhdRpt.RptCaseEco_542  
unpivot
(
val
for col in ('+ @colsunpivot +')
) u
 ) x1
 pivot
 (
     max(val)
     for EcoDate in ('+ @colspivot +')
 ) p'

exec(@query)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top