如何创建动态表

时间:2017-07-31 14:02:10

标签: sql sql-server

我有一个动态的透视查询,它生成一个结果集,我想将这些数据插入到表中。但问题是列被删除或生成的时间。所以当我无法预测列时。这就是我创建动态数据透视数据集的原因。那么如何将该数据集插入表中呢?

一种解决方案是每次都删除并重新创建表,但我不知道该怎么做。我尝试了CTETEM 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

2 个答案:

答案 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的光标更改同一个表。