我想使用C#访问存储过程脚本。
我使用了EXEC sp_HelpText STOREDPROCNAME
。这工作正常。
有没有办法分别检索存储过程查询和存储过程参数?
ex:我需要:
delete from [dbo].[tblTransactions] where [ID] = @ID
和
@ID numeric(18,0)
分开。
怎么做?
答案 0 :(得分:3)
最简单的方法是直接使用SqlCommandBuilder.DeriveParameters
从中指定的存储过程中检索参数信息 SqlCommand并填充了Parameters的Parameters集合 指定的SqlCommand对象。
还有
exec [dbname].[sys].[sp_procedure_params_rowset] @procedure_name=N'uspblabla'
您可以通过sp_helptext sp_procedure_params_rowset
查看来源。
答案 1 :(得分: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#中执行这些操作。
答案 2 :(得分: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