2017-01-06 72 views
0

我試圖運行多個SELECT命令,它們選擇相同的列集合,但是來自不同的數據庫,並且希望只需將列列出一次作爲變量,然後將其稱爲SELECT 。基於聲明列表的SELECT選擇

它是如何完成當前,但要少得多列&的SELECT:

SELECT Column1 
     ,Column2 
     ,Column3 
FROM [db1] 

--Processes 

SELECT Column1 
     ,Column2 
     ,Column3 
FROM [db2] 

--Processes 

SELECT Column1 
     ,Column2 
     ,Column3 
FROM [db3] 

--Processes 

想法是什麼,我希望能得到工作的:

DECLARE @ListofColumns VARCHAR; 
SET @ListofColumns = 'Column1,Column2,Column3'; 

SELECT @ListofColumns 
FROM [db1] 

--Processes 

SELECT @ListofColumns 
FROM [db2] 

--Processes 

SELECT @ListofColumns 
FROM [db3] 

--Processes 
+2

你將不得不使用動態SQL來做到這一點,那會代碼複雜化。 –

+0

動態SQL(EXEC/sp_executeSQL)是執行此操作的唯一方法,對象標識符不能存儲在變量中。 –

+0

如果每個查詢的結構完全相同,則可以使用(未​​記錄的)'sp_MSforeachdb'和'sp_MSforeachtable'存儲過程以及恰當的過濾器來定位對您很重要的數據庫和表。但是在這種情況下,我首先會質疑爲什麼同一個「類型」的數據存儲在多個地方 - 部分* data *反而變成了*元數據*(這裏成爲數據庫名稱)? –

回答

1

您將需要使用動態SQL這裏有這樣的東西.....

DECLARE @ListofColumns VARCHAR(1000) --<-- Define length here 
     ,@SQL NVarchar(MAX); 

SET @ListofColumns = 'Column1,Column2,Column3'; 

SET @SQL = N'SELECT ' + @ListofColumns + N' FROM [db1]' 

exec sp_executesql @SQL