2014-01-29 105 views
0

我有一個動態數據透視表,它在運行時產生未知數量的列。我試圖清除現有表中的數據,並將查詢結果插入到其中。我遇到的問題是,我不知道表格定義會提前做什麼,因爲它是動態的。在不知道表定義的情況下將動態數據透視表插入到現有表中

這裏是我得到的錯誤:
Msg 213, Level 16, State 7, Line 1 Column name or number of supplied values does not match table definition.

的轉動列是一個日期列可能有1個日期或日期1000+。 如何創建一個與我試圖插入的數據匹配的表定義?

這裏是我的查詢:

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) 

回答

3

我會DROP原始表,只是創建使用SELECT INTO條款飛新的。

通過使用SELECT INTO您不需要事先創建表或擔心它將具有哪些類型和多少列。 SQL Server將爲你創建它。

注意:這隻適用於表不存在。在INTO條款http://technet.microsoft.com/en-us/library/ms188029.aspx

作爲另一種選擇

完整的文檔,你可以隨時SELECT INTO #temp表,你可以刪除或者用它來你的其他表的模式,但我認爲這是一個你不想做額外的工作。

+0

謝謝。通過使用「DROP」,我可以清除舊數據並將新數據插入到具有相同名稱的表中。 –

0

你可以做這樣的事情:

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) 
相關問題