TSQL将N插入固定的临时表

问题描述

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

因此,假设查询返回4列,而temp表中有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)

返回错误“列名或提供的值数与表定义不匹配。”

我有一个变量,该变量计算枢轴将添加的列数,也许我可以对此做些什么?

解决方法

在回答Dynamic columns depend on previous dynamic columns - TSQL的底部,有一个示例,显示了来自轴的动态插入。

诀窍在于,您需要动态定义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)

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

我猜您已经有了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],' + @PivotColumnList + N'
        FROM YourPivotCTE;'

EXEC (@CustomSQL);

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...