2012-07-10 70 views
0

我使用的是SQL Server 2012中正在執行其在存儲過程值一起,是否有任何可能的方式來獲得存儲過程的所有參數與傳遞給它的值一起?如何獲得所有參數名與

我需要這些東西來構建一個XML。我的意思是這應該發生在正在執行的程序中,並且在所有程序中都應該是通用的。

例如,讓我們假設我們有程序,

  1. uspSave, @name='test' @age=20
  2. uspDelete @id=2
現在

uspSave過程中,我需要得到@name, @age和值 '測試',20 和uspDelete,我應該得到@id用值2

爲了得到列名,我想這一點,

select parameter_name 
from information_schema.PARAMETERS 
where specific_name = OBJECT_NAME(@@procid) 

現在可以遍歷上述查詢的結果,我們可以得到的值。

+0

你能澄清一下「爲什麼」 - 你的最終目標是什麼? – AdaTheDev 2012-07-10 08:42:54

+0

我的目標是用這些參數的值創建一個xml,當發生錯誤時,我必須將這個xml保存在錯誤表中 – Harsha 2012-07-10 08:47:45

+0

T-SQL不是富含類似反射設施的語言。按照您的要求編寫可重複使用的代碼幾乎是不可能的。 – 2012-07-10 08:54:18

回答

0

我認爲最好的辦法是使用一些代碼生成,生成您所需要的代碼塊。

  • 創建存儲過程無需代碼,XML-IFY參數
  • 敲了一個快速腳本(可以在T-SQL來完成),以進而構建TSQL的特定存儲過程塊轉換參數轉換成XML,使用INFORMATION_SCHEMA.PARAMETERS
  • 複製自動生成的腳本的那一點到您的存儲過程

您使用動態SQL所想的方式是行不通的因爲範圍 - 參數就不會是動態生成的SQL中訪問,你需要在將它們作爲通過sp_executesql的指定參數時,這使你回到廣場1

例如

DECLARE @someval int = 7 
EXECUTE('SELECT @someval') -- @someval is not in scope 

所以,如果它有助於節省時間,那麼代碼gen看起來就像是你最好的選擇。

+0

你是男人,那正是我想要的,但太糟糕了,執行官聲明的侷限性阻止了整個方法。無論如何,我試圖通過手動傳遞參數值來生成XML,我想這是唯一的方法。 – Harsha 2012-07-11 13:49:54