在不知道表定义的情况下将动态数据透视结果插入现有表中

时间:2014-01-29 22:16:15

标签: sql sql-server exec truncate insert-into

我有一个动态数据透视表,它会在运行时生成未知数量的列。我试图从现有表中清除数据并将查询结果插入其中。我遇到的问题是我不知道表定义会提前是什么,因为它是动态的。

这是我得到的错误:
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)

2 个答案:

答案 0 :(得分:3)

我会DROP原始表格,只需使用SELECT INTO子句动态创建新表格。

使用SELECT INTO您不需要事先创建表格,也不用担心它将具有什么类型和列数。 SQL Server将为您创建它。

注意:这仅在表不存在时才有效。

关于INTO条款http://technet.microsoft.com/en-us/library/ms188029.aspx

的完整文档

作为另一种选择,您可以始终SELECT INTO #temp表格,您可以放弃或使用它来建模您的其他表格,但我认为这是您不想做的额外工作。

答案 1 :(得分:0)

您可以这样做:

let colorTop =  UIColor.redColor().CGColor //your status bar color
   let colorBottom = UIColor.whiteColor().CGColor//color for your navigation bar
    let gradientLayer = CAGradientLayer()

     gradientLayer.colors = [ colorTop, colorBottom]
     gradientLayer.locations = [ 0.5, 0.5]
     gradientLayer.frame = CGRectMake(0, -20, 375, 64)

      self.navigationController?.navigationBar.layer.addSublayer(gradientLayer)