我有一个动态的透视查询,它生成一个结果集,我想将这些数据插入到表中。但问题是列被删除或生成的时间。所以当我无法预测列时。这就是我创建动态数据透视数据集的原因。那么如何将该数据集插入表中呢?
一种解决方案是每次都删除并重新创建表,但我不知道该怎么做。我尝试了CTE
,TEM
P表,但EXEC
仅支持select,insert,update,delete语句:
DECLARE @columns NVARCHAR(MAX), @sqlquery NVARCHAR(MAX), @orderby Nvarchar(MAX),@value Nvarchar(max);
SET @columns = N'';
SET @value=N'0'
SELECT @columns += N', ' + QUOTENAME([Note_Type])
FROM
(
SELECT distinct
No_T
FROM [DS_DM].[dbo].[DAILY_TABLE]
where No_T not in (570,80,150,590,80,99)
)as A order by No_T
SET @sqlquery = N'
Select
K._Number
,D.C_Number
,' + STUFF(@columns, 1, 2, '') + '
from
(
select
_Number
,' + STUFF(@columns, 1, 2, '') + '
from
(
select distinct
right(REPLICATE('+@value+',11) +_Number,11) as [_Number]
,No_t
,No_T_Des
FROM [DS_DM].[dbo].[DAILY_TABLE]
where No_T not in (570,80,150,590,80,99)
)AS J
pivot
(
count(No_T_Des) FOR [No_t] IN ('
+ STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '')
+ ')
)P
)K
left join
[DS_DM].[dbo].[D_TABLE] D on k._Number = D._Number
';
EXEC sp_executesql @sqlquery
答案 0 :(得分:0)
我修改了您的代码以反映我提出的解决方案。
IF OBJECT_ID (N'NEW_TABLE', N'U') IS NOT NULL
BEGIN
DROP TABLE NEW_TABLE
END
DECLARE @columns NVARCHAR(MAX), @sqlquery NVARCHAR(MAX), @orderby Nvarchar(MAX),@value Nvarchar(max);
SET @columns = N'';
SET @value=N'0'
SELECT @columns += N', ' + QUOTENAME([Note_Type])
FROM
(
SELECT distinct
No_T
FROM [DS_DM].[dbo].[DAILY_TABLE]
where No_T not in (570,80,150,590,80,99)
)as A order by No_T
SET @sqlquery = N'
Select
K._Number
,D.C_Number
,' + STUFF(@columns, 1, 2, '') + '
INTO NEW_TABLE
from
(
select
_Number
,' + STUFF(@columns, 1, 2, '') + '
from
(
select distinct
right(REPLICATE('+@value+',11) +_Number,11) as [_Number]
,No_t
,No_T_Des
FROM [DS_DM].[dbo].[DAILY_TABLE]
where No_T not in (570,80,150,590,80,99)
)AS J
pivot
(
count(No_T_Des) FOR [No_t] IN ('
+ STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '')
+ ')
)P
)K
left join
[DS_DM].[dbo].[D_TABLE] D on k._Number = D._Number
';
EXEC sp_executesql @sqlquery
答案 1 :(得分:0)
所以我找到了问题的答案。
每次都有2个文件,它们都是静态的。所以我创建了ETL,删除该表并使用这两个文件重新创建每一天。每天都有动态(掉落或新创造)的66列其余部分。所以我已经制作了一个光标,用于循环遍历所有类别并更改已创建的表并将该代码添加到ETL
如此低调每天ETL运行删除现有表,使用2个静态fild创建新表,并使用带有动态filds的光标更改同一个表。