2012-12-13 43 views
2

我需要一個select語句,在其from子句中運行另一個select語句,並且結果(只有一條記錄)是外層的表名選擇。在tsql中重複使用from子句中的無exec或存儲過程

爲此,我不能使用存儲過程,exec或@變量。

此外,查詢文件必須以'select'開始並僅包含該語句。

我知道有更好的方法來完成最終結果,但供應商的嚮導查詢必須通過嗅探除單個select語句之外的其他任何東西。它令人沮喪,但這就是我們必須合作的。

這裏是什麼,我試圖做一個例子:

select 
    plan.TransactionID, 
    plan.PlanName, 
    sum(plan.Value) as Rate 
from 
    (select 'dbo._Result' + ltrim(str(CalculationID)) from dbo.Calculation where Name = 
    'TPRL Transaction Plan Rates' 
) Plan 

當然,這是行不通的。然而,無論是做這個的:

select 
    plan.TransactionID, 
    plan.PlanName, 
    sum(plan.Value) as Rate 
from 
    exec(select 'dbo._Result' + ltrim(str(CalculationID)) from dbo.Calculation where Name = 'TPRL Transaction Plan Rates') Plan 

雖然,這本身並拉回來我想表到結果集:

exec(select 'dbo._Table' + ltrim(str(CalculationID)) from dbo.Calculation where Name = 'TPRL Transaction Plan Rates') 

所有我需要爲它做的是治療結果作爲從上面的文字(如在,宏替代),但它不以這種方式工作。

在tsql有沒有辦法做到這一點?

回答

1

不,這不能在非動態TSQL中完成。在TSQL中,表名不能是是變量或參數化的,只能用動態TSQL完成。

動態TSQL只能用EXEC('sql command')sp_ExecuteSql(..)完成。

繞開這個辦法: 除非你正在使用的設備都有自己的宏替換,那麼無論

  1. 讓你的客戶端第一次執行內部SQL查詢來確定表名,然後創建基於此的新文件/字符串。或
  2. 使用某種黑客SQL注入技巧欺騙您的設施,讓您認爲在執行上述動態SQL命令之一時正在執行SELECT。
+0

感謝RBarry_Young。我以前很怕那個。我在過去通過AQT parms以及@ variables和exec()完成了#1。它在這個特定的軟件中是不可能的。大聲笑,我很樂意嘗試#2,儘管我可能會因爲嘗試而被灌輸。然後再次,如果它可以工作,我可能會得到加薪。 – jetatwork

1

您的第一個查詢應該可以工作。您可以在FROM語句中執行子查詢。你得到什麼樣的錯誤?

瞭解了需求之後,我相信動態SQL是需要的。

+0

我看到我上面有一個錯字,其中Plan應該是計劃,Plan/plan也是關鍵詞,但是通過使用'x'作爲別名來修復錯誤,錯誤是:沒有指定列名'x'的第1列。我很確定它在內部選擇中看到我的一個結果,並且認爲「沒有x的TransactionID,沒有x的PlanName」。 – jetatwork

+0

我想我誤解了你的問題。我同意RBarryYoung,你將需要使用動態SQL。 – Neil

+0

謝謝,尼爾。一旦我獲得足夠的代表,我會將您的回覆+1(這是一個僅用於工作的新帳戶)。 – jetatwork