SELECT 来自表名

SELECT FROM TABLES NAME LIKE

我在 SQL 服务器数据库 (SSMS) 中有 1000 个 table,我想将 1000 个 table 中的选定列放入 1 个新的 table。

我想做这样的事情

  1. 创建一个包含 a、b、c 列的新 table

  2. 确定要从中选择数据的 1000 tables - table 根据通配符之类的内容选择名称。

    在数据库中,有很多 tables 和名字都遵循类似的模式,例如ABC_0001, ABC_0002 ... ABC_1000, XYZ_0001, XYZ_0002, ... XYZ_1000 等...我只想要 tables 以 ABC 开始被选中..

  3. Select 1000 table 中的 a、b、c 列,并将值插入在步骤 #1

    中创建的 table

我是这样做的:

SELECT a, b, c FROM ABC_0001 UNION_ALL
SELECT a, b, c FROM ABC_0002 UNION_ALL
SELECT a, b, c FROM ABC_1000 
INSERT INTO NEW_TABLE

并想做类似

的事情
SELECT a, b, c FROM TABLE LIKE ABC_% 
INSERT INTO NEW_TABLE

您可以执行以下操作:

-- use 'UNION' to select only distinct values, and UNION ALL if you want to select all rows

SELECT * 
    INTO [NEW_TABLE]
        FROM ABC_001
            UNION ALL
        SELECT * FROM ABC_002
            UNION ALL
        SELECT * FROM ABC_003
            UNION ALL
        -- and so on...
        SELECT * FROM ABC_999
        -- there's no need to use UNION on the last select

如果您真的不想键入所有 999+ 表,您可以从名称与您想要的模式相匹配的表中编写一个存储过程到 select。

参考文献:
https://www.w3schools.com/sql/sql_ref_union.asp
SELECT INTO USING UNION QUERY
SQL Server select data from 100+ tables

你可以用Dynamic SQLCURSOR OR WHILE LOOP来实现,我是用CURSOR实现的。如果您不想在新的 table.

中插入重复条目,请使用 UNION 而不是 UNION ALL

DROP TABLE IF EXISTS TABLE_NEW
CREATE TABLE TABLE_NEW (A VARCHAR,B VARCHAR, C VARCHAR) -- Modify according to your need
DECLARE @Sql NVARCHAR(MAX) = ''
,@TableName VARCHAR(500)
,@Id INT

DECLARE Table_Cursor CURSOR FOR 
SELECT 
ROW_NUMBER() OVER (ORDER BY TABLE_NAME ASC) Id
,TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_TYPE = 'BASE TABLE' 
AND TABLE_NAME LIKE 'ABC_%'

OPEN Table_Cursor  
FETCH NEXT FROM Table_Cursor INTO @Id,@TableName 

WHILE @@FETCH_STATUS = 0  
BEGIN  
     IF(@Id = 1)
        BEGIN
            
            SET @Sql = @Sql + 'SELECT A, B, C FROM '+@TableName ----Modify the columns based on your column names
            SELECT @SQL
        END
     ELSE
        BEGIN
            SET @Sql = @Sql + ' UNION ALL SELECT A, B, C FROM '+@TableName --Modify the columns based on your column names
        END

     FETCH NEXT FROM Table_Cursor INTO @Id,@TableName
END 

CLOSE Table_Cursor  
DEALLOCATE Table_Cursor

INSERT INTO NEW_TABLE 
EXEC (@Sql)

根据您的新要求添加了以下答案。您可以检查 column 是否出现在 table 中,然后根据您得到的结果做出决定。我已经使用 IIF()COL_LENGTH() 函数来实现这一点。

DROP TABLE IF EXISTS TABLE_NEW
CREATE TABLE TABLE_NEW (A VARCHAR,B VARCHAR, C VARCHAR) -- Modify according to your need
DECLARE @Sql NVARCHAR(MAX) = ''
,@TableName VARCHAR(500)
,@Id INT

DECLARE Table_Cursor CURSOR FOR 
SELECT 
ROW_NUMBER() OVER (ORDER BY TABLE_NAME ASC) Id
,TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_TYPE = 'BASE TABLE' 
AND TABLE_NAME LIKE 'Temp%'

OPEN Table_Cursor  
FETCH NEXT FROM Table_Cursor INTO @Id,@TableName 

WHILE @@FETCH_STATUS = 0  
BEGIN  
     
     --Declare variables for all your columns here and assign the column name as the value

     DECLARE @A VARCHAR(100) = 'A', @B VARCHAR(100) = 'B',@C VARCHAR(100) = 'C'

     SELECT @A = IIF(COL_LENGTH(@TableName, @A)>0,@A,'NULL')
     SELECT @B = IIF(COL_LENGTH(@TableName, @B)>0,@B,'NULL')
     SELECT @C = IIF(COL_LENGTH(@TableName, @C)>0,@C,'NULL')

     IF(@Id = 1)
        BEGIN
            
            SET @Sql = @Sql + 'SELECT '+@A+' AS A, '+@B+' AS B, '+@C+' AS C FROM '+@TableName ----Modify the columns based on your column names
            SELECT @A AS A
        END
     ELSE
        BEGIN
            SET @Sql = @Sql + ' UNION ALL SELECT '+@A+' AS A, '+@B+' AS B, '+@C+' AS C FROM '+@TableName --Modify the columns based on your column names
        END

     FETCH NEXT FROM Table_Cursor INTO @Id,@TableName
END
CLOSE Table_Cursor  
DEALLOCATE Table_Cursor

INSERT INTO TABLE_NEW
SELECT @SQL