TSQL将N插入固定临时表

Posted

技术标签:

【中文标题】TSQL将N插入固定临时表【英文标题】:TSQL Insert N into fixed temp table 【发布时间】:2020-10-20 10:55:20 【问题描述】:

我得到一个带有动态轴的查询,它将返回 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 子句中定义你想要INSERT 的列。 当数据透视查询的结果是动态的时,我该怎么做? 【参考方案1】:

在我对Dynamic columns depend on previous dynamic columns - TSQL 的回答的底部,我有一个从枢轴动态插入的示例。

诀窍是您需要动态定义插入命令,以及动态制作枢轴。

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

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)

在上面,表上的列名和数据透视匹配(它们是“Bucketname”值 - 它是按月动态存储销售量)。但是,在您的情况下,您可能需要两个列列表 - 一个用于 Pivot,一个用于插入。

我猜您已经有了 Pivot 的列列表(因为您通常需要一个动态执行此操作),因此您只需要专注于为插入创建正确的列列表。

如果您需要更多信息,请随时在此处发表评论 - 如果您包含用于创建数据透视表的代码(可能在问题中而不是评论中)会有所帮助。但是,如果您准备好享受动态 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);

【讨论】:

感谢您的回复!在使用枢轴将添加的列数动态构建 InsertColumnList 后,我​​让它工作:) 太棒了!听起来您已经完成了动态支点的艰苦工作……只需要最后一点帮助。 正确 :) 首先,我只需要动态数据透视,直到我开始在 Crystal Reports 中使用存储过程。水晶报表不欣赏动态数据哈哈。也是第一次使用动态SQL,所以水晶报表开始抱怨后很头疼

以上是关于TSQL将N插入固定临时表的主要内容,如果未能解决你的问题,请参考以下文章

TSQL--临时表和表变量

TSQL - 排除与临时表匹配的行

将存储过程结果插入临时表

mysql创建临时表,将查询结果插入已有的表

将数据插入临时表

SQL 从临时表插入表,并将输出插入临时表