2012-04-06 92 views
4

有沒有一種方法可以在不實際執行SQL語句的情況下獲取SQL查詢將返回的列?獲取從SQL語句返回的列

我看着使用set showplan_all on和使用OutputList字段,但結果不是我想要的。我需要按照正確的順序和正確的列名(如果它們是別名)來獲取列。

我正在使用SQL Server 2008 R2。

澄清,這裏是一個查詢的例子,可以運行:

--log that the user has executed a query 
insert into execution_log_table 
(timestamp 
,user_id 
,report_id) 
values (CURRENT_TIMESTAMP 
,1234 
,5678) 

select * 
from (select column1 
,column2 
from another_table) tbl 

我不想試圖讓列返回時,將任何物品進入第一個表。

*注意:這只是一個簡單的例子,我有一些SQL語句是數百行代碼執行多個crud操作。我知道我可以嘗試手動解析代碼行,但我的問題是針對使用SQL服務器解析器來確定在最終選擇語句中返回哪些列的方法。

+0

這個問題與使用SqlBulkCopy有關嗎? – Phil 2012-04-06 19:56:21

+0

不,我有一個報告應用程序,可以通過無需執行SQL語句來檢索列而受益。 – ChandlerPelhams 2012-04-06 20:09:18

回答

1

SET FMTONLY ON。據「返回」空結果集,但應該不會影響任何實際表:

set fmtonly on 
go 
insert into execution_log_table 
([timestamp] 
,user_id 
,report_id) 
values (CURRENT_TIMESTAMP 
,1234 
,5678) 

select * 
from (select column1 
,column2 
from another_table) tbl 

順便說一句,記得使用任何其他活動一樣連接之前將其關閉(使用SET FMTONLY OFF在它自己的批次中),否則你可能會混淆一段時間。 (正如我在試圖創建表來測試你的一批語句時所做的那樣,忘記了CREATE TABLE本身會在默認情況下失敗(帶有成功消息),一旦FMTONLY開啓)。


我剛剛注意到,這個功能似乎被棄用,並且更換隻允許您檢索有關第一結果集的信息。面對複雜的查詢,有哪些有什麼用?

+0

我仍在使用2008 R2,這是一個不會折舊的版本,所以這對我來說非常有用(至少在可預見的未來)。這正是我所期待的。謝謝! – ChandlerPelhams 2012-04-09 15:39:41

1

我不認爲這是可能的,但你當然可以這樣做

select <column list> 
    ... blah blah 
    where 1=0 

爲了得到結果沒有任何結果集的形狀。

您必須執行查詢,但執行時間會很短。

+0

當然,真正簡單的解決方案是隻指定查詢輸出的列。 – lyrisey 2012-04-06 19:52:44

+0

這將無法正常工作,因爲SQL代碼不會提前知道。它可能包含幾個可能在最終選擇之前插入/更新數據的語句。 – ChandlerPelhams 2012-04-06 20:08:12

+0

難道你不能將最終選擇分解出來嗎? – Phil 2012-04-06 20:10:19