Problem solved by my own answer below
I was referring to How to combine two dynamic sql with union ALL but it doesn't work
the problem of my query is that the union method couldn't work because it doesn't get the data from the variable on top, given the fact that it is alraedy executed : exec(insert1) and exec(insert2)
and the purpose of union is to get the db_name by selecting 'table_catalog' later,because if 'table_catalog' is selected before the comparison,the output will be wrong
here's the query
Declare @PilotDBName nvarchar(255)
Declare @LiveDBName nvarchar(255)
Declare @Table1 Table(TABLE_SCHEMA nvarchar(255) , VIEW_NAME nvarchar(255), COLUMN_NAME nvarchar(255), table_type nvarchar(255))
Declare @Table2 Table(TABLE_SCHEMA nvarchar(255) , VIEW_NAME nvarchar(255), COLUMN_NAME nvarchar(255), table_type nvarchar(255))
Declare @Table3 Table(TABLE_SCHEMA nvarchar(255) , VIEW_NAME nvarchar(255), COLUMN_NAME nvarchar(255), table_type nvarchar(255))
Declare @Table4 Table(TABLE_SCHEMA nvarchar(255) , VIEW_NAME nvarchar(255), COLUMN_NAME nvarchar(255), table_type nvarchar(255))
Declare @Table5 Table(TABLE_SCHEMA nvarchar(255) , VIEW_NAME nvarchar(255), COLUMN_NAME nvarchar(255), table_type nvarchar(255))
Declare @Table6 Table(TABLE_SCHEMA nvarchar(255) , VIEW_NAME nvarchar(255), COLUMN_NAME nvarchar(255), table_type nvarchar(255), table_catalog nvarchar(255))
Declare @Table7 Table(TABLE_SCHEMA nvarchar(255) , VIEW_NAME nvarchar(255), COLUMN_NAME nvarchar(255), table_type nvarchar(255), table_catalog nvarchar(255))
Set @PilotDBName = 'LON_HRMS'
Set @LiveDBName = 'VSM641SP3QC'
Declare @insert1 NVARCHAR(MAX)
set @insert1 = '
Declare @Table1 Table(TABLE_SCHEMA nvarchar(255) , VIEW_NAME nvarchar(255), COLUMN_NAME nvarchar(255), table_type nvarchar(255))
INSERT INTO @Table1
SELECT a.TABLE_SCHEMA, a.VIEW_NAME, COLUMN_NAME, b.table_type
FROM '+@PilotDBName+'.INFORMATION_SCHEMA.VIEW_COLUMN_USAGE a Inner join '+@PilotDBName+'.information_schema.tables b
on a.TABLE_NAME = b.TABLE_NAME
where b.table_type=''BASE TABLE''
EXCEPT
SELECT a.TABLE_SCHEMA, a.VIEW_NAME, COLUMN_NAME,b.table_type
FROM '+@LiveDBName+'.INFORMATION_SCHEMA.VIEW_COLUMN_USAGE a Inner join '+@LiveDBName+'.information_schema.tables b
on a.TABLE_NAME = b.TABLE_NAME
where b.table_type=''BASE TABLE'' ORDER BY VIEW_NAME '
EXEC(@insert1)
Declare @insert2 NVARCHAR(MAX)
Declare @SQLResult NVARCHAR(MAX)
Set @insert2 = '
Declare @Table2 Table(TABLE_SCHEMA nvarchar(255) , VIEW_NAME nvarchar(255), COLUMN_NAME nvarchar(255), table_type nvarchar(255))
INSERT INTO @Table2
SELECT a.TABLE_SCHEMA, a.VIEW_NAME, COLUMN_NAME, b.table_type
FROM '+@LiveDBName+'.INFORMATION_SCHEMA.VIEW_COLUMN_USAGE a Inner join '+@LiveDBName+'.information_schema.tables b
on a.TABLE_NAME = b.TABLE_NAME
where b.table_type=''BASE TABLE''
EXCEPT
SELECT a.TABLE_SCHEMA, a.VIEW_NAME, COLUMN_NAME,b.table_type
FROM '+@PilotDBName+'.INFORMATION_SCHEMA.VIEW_COLUMN_USAGE a Inner join '+@PilotDBName+'.information_schema.tables b
on a.TABLE_NAME = b.TABLE_NAME
where b.table_type=''BASE TABLE'' ORDER BY VIEW_NAME '
Exec(@insert2)
Declare @insert5 NVARCHAR(MAX) = '
Declare @Table1 Table(TABLE_SCHEMA nvarchar(255) , VIEW_NAME nvarchar(255), COLUMN_NAME nvarchar(255), table_type nvarchar(255))
Declare @Table2 Table(TABLE_SCHEMA nvarchar(255) , VIEW_NAME nvarchar(255), COLUMN_NAME nvarchar(255), table_type nvarchar(255))
Declare @Table5 Table(TABLE_SCHEMA nvarchar(255) , VIEW_NAME nvarchar(255), COLUMN_NAME nvarchar(255), table_type nvarchar(255))
Insert into @Table5
select * From Table1
Union
select * from @Table2'
Exec(@insert1)Exec(@insert2)Exec(@insert5)
before i show the output, records in queries are:
insert 1: 243 rows insert 2: 1 rows insert 5: 0 rows


INSERTandSETdon't go together in the same statement.