2012-03-15 66 views
-1

我想使用C#訪問存儲過程腳本。我使用EXEC sp_HelpText STOREDPROCNAME。這工作正常。分別檢索存儲過程腳本和參數

有沒有什麼辦法可以單獨檢索存儲過程查詢和存儲過程參數?

恩:我需要:

delete from [dbo].[tblTransactions] where [ID] = @ID 

@ID numeric(18,0) 

分開。

如何做到這一點?

回答

2

你能得到身體這種方式,但沒有一種方法來解析出的個別語句:

SELECT definition FROM sys.sql_modules 
WHERE [object_id] = OBJECT_ID('dbo.procedurename'); 

你可以得到它的參數:

SELECT name, system_type_id, max_length, precision, scale 
FROM sys.parameters 
WHERE [object_id] = OBJECT_ID('dbo.procedurename'); 

請注意,您如果沒有強制解析定義參數是否具有默認值,則無法確定,如果是,則默認值是什麼。您可以更好地使用RegEx或其他解析方法在C#中執行這些操作。

+0

參數部分工作正常。正如你告訴聲明部分即將到來......任何其他方式?至少在C#代碼? – Olivarsham 2012-03-15 13:20:35

+1

不幸的是,由於可能有這麼多的語法風格,因此您很難確定過程的主體開始和結束的位置,以及過程中的單個語句開始和結束的位置。繼續編寫一個RegEx,它從程序中提取出單個語句,然後編寫一個程序來打破它。 :-) – 2012-03-15 13:22:12

+0

這是瘋狂的,這返回列[has_default_value]和[default_value],但他們沒有填充。似乎你必須使用SMO對象來獲取這些信息。 – tbone 2015-08-18 23:01:59

2

最簡單的方法就是請直接分貝SqlCommandBuilder.DeriveParameters

檢索從 中的SqlCommand中指定的存儲過程的參數信息,並填充 指定SqlCommand對象的參數集合。

還有

exec [dbname].[sys].[sp_procedure_params_rowset] @procedure_name=N'uspblabla'

其中,你可以通過sp_helptext sp_procedure_params_rowset看到源代碼。

+0

那麼聲明怎麼樣? AS之後的sp_helptext爲 – Olivarsham 2012-03-15 13:32:41

+0

? – 2012-03-15 13:33:11

1

您可以添加引用Microsoft.SqlServer.Smo和使用類似於下面的代碼:

void Main() 
{ 
    Server server = new Server("server"); 
    Database db = server.Databases["database"]; 

    string sprocName = "StoredProcName"; 

    StoredProcedure proc = db.StoredProcedures[sprocName]; 
    if (proc != null) 
    { 
     foreach (StoredProcedureParameter parameter in proc.Parameters) 
     { 
      Console.WriteLine("{0}: {1}", parameter.DataType.Name, parameter.Name); 
     } 

     Console.WriteLine(proc.TextBody); 
    } 
} 

更多信息,可以發現Here