我還是建議去與@iliketocode。
動態列生成按您的要求
這只是另一種選擇,但你想要的(只有它需要一定的時間來執行,而不是上面的回答)純粹是動態的。爲了在不定義每列的情況下實現結果,可以創建動態查詢,通過循環自動將列添加爲null。
我面對,並且由於時間很短,我是如上面做了同樣的問題。但是今天我會填充以給出適當的解決方案(當時我還沒有完成),並且我會爲您創建一個樣本,希望這對您有所幫助。
--create table t1 (col1 int , col2 int, col3 int)
--create table t2 (col1 int , col2 int, col3 int, col4 int)
--insert into t1 values (1,11,111), (2,22,222)
--insert into t2 values (1,11,111,1111), (2,22,222,null)
--Step 1 - Declaration of variable
Declare @NoOfColumnForUnion int = 5
declare @T1TableColumnList nvarchar(max) ='' ,@T2TableColumnList nvarchar(max) ='' , @colName nvarchar(500) , @test cursor
--Step 2 - Get the column list of first table i.e. t1 and store into @T1TableColumnList variable
set @test = cursor for
select name from syscolumns
where id = object_id('t1')
open @test
fetch next from @test into @colName
while @@fetch_status = 0
begin
set @T1TableColumnList = @T1TableColumnList + @colName + ','
fetch next from @test into @colName
end
set @T1TableColumnList = left(@T1TableColumnList , len(@T1TableColumnList)-1)
close @test
deallocate @test
--Step 3 - Get the column list of Second table i.e. t2 and store into @T2TableColumnList variable
set @test = cursor for
select name from syscolumns
where id = object_id('t2')
open @test
fetch next from @test into @colName
while @@fetch_status = 0
begin
set @T2TableColumnList = @T2TableColumnList + @colName + ','
fetch next from @test into @colName
end
set @T2TableColumnList = left(@T2TableColumnList , len(@T2TableColumnList)-1)
close @test
deallocate @test
--Step 4 - Check the length of column list to add null columns or remove columns
--First table check
Declare @T1lengthofColumnList int
set @T1lengthofColumnList = (len(@T1TableColumnList) - len(replace(@T1TableColumnList, ',', ''))) + 1
--add columns
if(@T1lengthofColumnList < @NoOfColumnForUnion)
Begin
While (@T1lengthofColumnList < @NoOfColumnForUnion)
Begin
set @T1lengthofColumnList = @T1lengthofColumnList + 1
Set @T1TableColumnList = @T1TableColumnList + ', null col' + cast(@T1lengthofColumnList as varchar(10))
End
End
--remove columns
Else if(@T1lengthofColumnList > @NoOfColumnForUnion)
Begin
While (@T1lengthofColumnList > @NoOfColumnForUnion)
Begin
set @T1lengthofColumnList = @T1lengthofColumnList - 1
Set @T1TableColumnList = LEFT(@T1TableColumnList, LEN(@T1TableColumnList) - CHARINDEX(',',REVERSE(@T1TableColumnList)))
End
End
--Second table check
Declare @T2lengthofColumnList int
set @T2lengthofColumnList = (len(@T2TableColumnList) - len(replace(@T2TableColumnList, ',', ''))) + 1
--add columns
if(@T2lengthofColumnList < @NoOfColumnForUnion)
Begin
While (@T2lengthofColumnList < @NoOfColumnForUnion)
Begin
set @T2lengthofColumnList = @T2lengthofColumnList + 1
Set @T2TableColumnList = @T2TableColumnList + ', null col' + cast(@T2lengthofColumnList as varchar(10))
End
End
--remove columns
Else if(@T2lengthofColumnList > @NoOfColumnForUnion)
Begin
While (@T2lengthofColumnList > @NoOfColumnForUnion)
Begin
set @T2lengthofColumnList = @T2lengthofColumnList - 1
Set @T2TableColumnList = LEFT(@T2TableColumnList, LEN(@T2TableColumnList) - CHARINDEX(',',REVERSE(@T2TableColumnList)))
End
End
--Step 5 - create dynamic query and execute
DECLARE @template AS varchar(max)
SET @template = 'select ' + @T1TableColumnList + ' from t1 union all '
+ ' select ' + @T2TableColumnList + ' from t2 '
select @template
EXEC (@template)
--drop table t1
--drop table t2
默認情況下,它將採用第一個select語句中列的名稱,例如,只需選擇「NULL NULL,NULL,NULL,h_id FROM table_2」。 – ZLK
查看我的答案以便隨心所欲地幫助到您。 – Ajay2707