TSQL在固定温度表中插入N

TSQL在固定温度表中插入N,tsql,pivot,top-n,Tsql,Pivot,Top N,我得到了一个带有动态透视的查询,它将返回N列。我想将结果插入到定义了固定列数的临时表中 假设查询返回4列,临时表有20列,我如何将结果插入前4列,而将其余的保留为空 临时表: create table #tempTable ( Id bigint, [Name] uniqueidentifier, Column_1 nvarchar(max), Column_2 nvarchar(max), Column_3 nvarchar(max), Column_4 nvarchar(max), Colu

我得到了一个带有动态透视的查询,它将返回N列。我想将结果插入到定义了固定列数的临时表中

假设查询返回4列,临时表有20列,我如何将结果插入前4列,而将其余的保留为空

临时表:

create table #tempTable (
Id bigint, [Name] uniqueidentifier,
Column_1 nvarchar(max), Column_2 nvarchar(max), Column_3 nvarchar(max), Column_4 nvarchar(max), Column_5 nvarchar(max),
Column_6 nvarchar(max), Column_7 nvarchar(max), Column_8 nvarchar(max), Column_9 nvarchar(max), Column_10 nvarchar(max),
Column_11 nvarchar(max), Column_12 nvarchar(max), Column_13 nvarchar(max), Column_14 nvarchar(max), Column_15 nvarchar(max),
Column_16 nvarchar(max), Column_17 nvarchar(max), Column_18 nvarchar(max), Column_19 nvarchar(max), Column_20 nvarchar(max)
)
我用来插入的代码:

INSERT INTO #tempTable VALUES (@query)
返回错误“提供的值的列名或数量与表定义不匹配”


我有一个变量,它计算透视图将添加的列数,也许我可以用它做些什么?

在我的答案底部,我有一个透视图的动态插入示例

诀窍在于,您需要动态定义insert命令,以及动态生成轴

在这里的示例中,我使用了以下内容

DECLARE @sql3 nvarchar(max)
SET @sql3 = N'
;WITH StockPivotCTE AS
        (SELECT  *
            FROM (SELECT StockNum, BucketName, StockAtEnd
                    FROM #StockProjections
                ) StockSummary
        PIVOT
            (SUM(StockAtEnd)
            FOR [BucketName]
            IN (' + @columnList + N')
            ) AS StockPivot
        )
    INSERT INTO #tmp (StockNum, ' + @columnList + N')
        SELECT StockNum, ' + @columnList + N'
        FROM StockPivotCTE'
EXEC (@sql3)
在上面的例子中,表上的列名和pivot匹配(它们是'Bucketname'值-它是按月动态计算销售额)。但是,在您的情况下,您可能需要两个列列表—一个用于透视,另一个用于插入

我猜您已经有了Pivot的columnlist(因为您通常需要一个来动态执行),所以您应该只需要专注于为插入创建正确的列列表

如果您需要其他信息,请随意在此处发表评论-如果您包含用于创建轴心的代码(可能在问题中而不是评论中),这会有所帮助。但是,如果您准备好享受动态SQL的乐趣,这应该足以让您继续

大体上说,我希望它看起来像这样

-- Assume @PivotColumnList has been defined previously - these are the columns in the pivot

DECLARE @InsertSQL nvarchar(max); -- Used for dynamic SQL

DECLARE @InsertColumnList nvarchar(1000); -- List of columns in the table to be inserted to

-- Then dynamically set your insert columnlist e.g., 
-- '[Column_1], [Column_2], [Column_3], [Column_4], [Column_5], [Column_6], [Column_7]'

SET @CustomSQL = 
N'WITH YourPivotCTE AS
        (-- yourPivotcommand
        SELECT ...
        PIVOT ...
            (...
            FOR ... IN (' + @PivotColumnList' + N)
            ) AS pvt
        )
    INSERT INTO #tempTable ([Id], [Name],' + @InsertColumnList + N') 
        SELECT [Id], [Name], ' + @PivotColumnList + N'
        FROM YourPivotCTE;'

EXEC (@CustomSQL);

INSERT
子句中定义要
INSERT
插入的列。当pivot查询的结果是动态的时,我该怎么做?感谢您的回复!在使用pivot将添加的列数动态构建InsertColumnList之后,我让它开始工作:)太棒了!听起来你已经用动态枢轴完成了艰苦的工作。。。只需要最后一点帮助。正确:)首先,我只需要动态透视,直到我开始在Crystal Reports中使用存储过程。Crystal Reports不喜欢动态数据哈哈。也是第一次使用动态SQL,所以在crystal reports开始抱怨后,这是一个相当头痛的问题