TSQL 将 N 插入固定温度 table
TSQL Insert N into fixed temp table
我得到了一个包含 return N 列的动态数据透视表的查询。我想将结果插入到定义了固定列数的临时 table 中。
假设查询 return 有 4 列,而临时 table 有 20 列,我怎样才能将结果插入前 4 列并将其余列保留为空?
温度table:
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)
Returns 错误“列名或提供的值数量与 table 定义不匹配。”
我有一个变量来计算枢轴将添加的列数,也许我可以用它做点什么?
在我对 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)
在上面,table 上的列名称和数据透视匹配(它们是 '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], [Name], ' + @PivotColumnList + N'
FROM YourPivotCTE;'
EXEC (@CustomSQL);
我得到了一个包含 return N 列的动态数据透视表的查询。我想将结果插入到定义了固定列数的临时 table 中。
假设查询 return 有 4 列,而临时 table 有 20 列,我怎样才能将结果插入前 4 列并将其余列保留为空?
温度table:
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)
Returns 错误“列名或提供的值数量与 table 定义不匹配。”
我有一个变量来计算枢轴将添加的列数,也许我可以用它做点什么?
在我对 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)
在上面,table 上的列名称和数据透视匹配(它们是 '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], [Name], ' + @PivotColumnList + N'
FROM YourPivotCTE;'
EXEC (@CustomSQL);