You can use Dynamic SQL
and CURSOR OR WHILE LOOP
to achieve this, I implemented it using CURSOR
. use UNION
instead of UNION ALL
if you don't want to insert duplicate entries into the new table.
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)
Added the below answer as per your new requirement. you can check whether a column
present in a table
or not and then take decision based on the result you get. I have used IIF()
and COL_LENGTH()
functions to achieve this.
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