TSQL在固定温度表中插入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), 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)

返回错误";列名或提供的值的数目与表定义不匹配">

我有一个变量,它计算枢轴将添加的列数,也许我可以用它做点什么?

在我对"动态列依赖于以前的动态列"的回答的底部,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,另一个用于insert。

我猜您已经有了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);

最新更新