我想使用C#訪問存儲過程腳本。我使用EXEC sp_HelpText STOREDPROCNAME
。這工作正常。分別檢索存儲過程腳本和參數
有沒有什麼辦法可以單獨檢索存儲過程查詢和存儲過程參數?
恩:我需要:
delete from [dbo].[tblTransactions] where [ID] = @ID
和
@ID numeric(18,0)
分開。
如何做到這一點?
我想使用C#訪問存儲過程腳本。我使用EXEC sp_HelpText STOREDPROCNAME
。這工作正常。分別檢索存儲過程腳本和參數
有沒有什麼辦法可以單獨檢索存儲過程查詢和存儲過程參數?
恩:我需要:
delete from [dbo].[tblTransactions] where [ID] = @ID
和
@ID numeric(18,0)
分開。
如何做到這一點?
你能得到身體這種方式,但沒有一種方法來解析出的個別語句:
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#中執行這些操作。
最簡單的方法就是請直接分貝SqlCommandBuilder.DeriveParameters
檢索從 中的SqlCommand中指定的存儲過程的參數信息,並填充 指定SqlCommand對象的參數集合。
還有
exec [dbname].[sys].[sp_procedure_params_rowset] @procedure_name=N'uspblabla'
其中,你可以通過sp_helptext sp_procedure_params_rowset
看到源代碼。
那麼聲明怎麼樣? AS之後的sp_helptext爲 – Olivarsham 2012-03-15 13:32:41
? – 2012-03-15 13:33:11
您可以添加引用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
參數部分工作正常。正如你告訴聲明部分即將到來......任何其他方式?至少在C#代碼? – Olivarsham 2012-03-15 13:20:35
不幸的是,由於可能有這麼多的語法風格,因此您很難確定過程的主體開始和結束的位置,以及過程中的單個語句開始和結束的位置。繼續編寫一個RegEx,它從程序中提取出單個語句,然後編寫一個程序來打破它。 :-) – 2012-03-15 13:22:12
這是瘋狂的,這返回列[has_default_value]和[default_value],但他們沒有填充。似乎你必須使用SMO對象來獲取這些信息。 – tbone 2015-08-18 23:01:59