首页 > 解决方案 > 插入和 *

问题描述

我正在尝试执行一系列表格比较,其中每个表格代表给定日期的数据提取。随着时间的流逝,表中的字段数量增加了。除了越来越多的字段外,这些表的结构相同,所有新字段都被添加为最右边的字段。

为此,我试图将每个表中的数据移动到本地临时表中,我可以在其中索引它们并多次查询它们。

总结版本如下。它将从其他地方以编程方式调用,并多次填充日期数字:

IF OBJECT_ID('tempdb..##direct_RISK') IS NULL 
    BEGIN
        SELECT TOP 0 * INTO ##direct_risk FROM DATA_20191231 
    END
ELSE
    DELETE FROM ##direct_RISK


IF OBJECT_ID('tempdb..##direct_lead') IS NULL 
    BEGIN 
        SELECT TOP 0 * INTO ##direct_lead FROM DATA_20200131
    END
ELSE
    DELETE FROM ##direct_lead

IF OBJECT_ID('DATA_20210801') IS NOT NULL INSERT INTO ##direct_lead SELECT * FROM DATA_20200131
INSERT INTO ##direct_risk SELECT * FROM DATA_20191231

在完整版本中,还为每个表添加了一个索引,并将一个过滤器应用于 SELECT 查询。

是否有某种方法可以维护这个简单的结构,而无需命名所有字段,当字段数量不同时,这些字段在 INSERT 阶段不会中断?

标签: sqlsql-servertsqlsql-insert

解决方案


对于语法:
SELECT TOP 0 * INTO ##direct_risk FROM DATA_20191231
要为每个源表或视图工作,您需要具有相同的列。

我认为一个更简单的解决方案是创建一组视图,每个表一个,在这些视图中您将添加稍后创建的列,例如:

CREATE VIEW DATA_20191231_Normalized AS
SELECT
 S.col1,
 S.col2,
 CAST(null as int) AS new_col3
FROM DATA_20191231 AS S

然后,所有视图将为您的脚本预设相同的模式。


推荐阅读