C# 分别检索存储过程脚本和参数

C# 分别检索存储过程脚本和参数,c#,sql,sql-server,stored-procedures,parameters,C#,Sql,Sql Server,Stored Procedures,Parameters,我想使用C#访问存储过程脚本 我使用了EXEC sp\u HelpText STOREDPROCNAME。这很好用 有没有办法分别检索存储过程查询和存储过程参数 例:我需要: delete from [dbo].[tblTransactions] where [ID] = @ID 及 分开 如何做到这一点?您可以通过这种方式获得正文,但是没有一种方法可以解析出单独的语句: SELECT definition FROM sys.sql_modules WHERE [object_id] = O

我想使用C#访问存储过程脚本

我使用了
EXEC sp\u HelpText STOREDPROCNAME
。这很好用

有没有办法分别检索存储过程查询和存储过程参数

例:我需要:

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

分开


如何做到这一点?

您可以通过这种方式获得正文,但是没有一种方法可以解析出单独的语句:

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');

请注意,如果不对定义进行暴力解析,您无法确定参数是否具有默认值,如果具有默认值,则无法确定默认值是什么。使用正则表达式或其他解析方法,或类似于PowerShell的方法,您可以更好地在C#中执行这些操作。

最简单的方法是直接使用

从中指定的存储过程检索参数信息 SqlCommand并填充 指定的SqlCommand对象

还有

exec[dbname].[sys].[sp_procedure\u params\u rowset]@procedure\u name=N'uspblabla'


您可以通过
sp\u helptext sp\u procedure\u params\u rowset

查看其源代码。您可以添加对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);
    }
}

可以找到其他信息

参数部分工作正常。正如你所说的,声明的一部分就要来了。。还有别的办法吗?至少在C#代码中是这样?不幸的是,由于有这么多语法样式,您很难确定过程主体的开始和结束位置,以及过程中各个语句的开始和结束位置。继续写一个正则表达式,从一个过程中提取一条语句,我将写一个过程来打破它。:-)这会返回[has_default_value]和[default_value]列,但它们没有填充,这真是不可思议。似乎您必须使用SMO对象来获取此信息。@t我同意,我在近十年前提交了一个连接项,但它仍然没有得到解决。请评论和投票!他们说:“不要把无能解释为恶意。”我不知道为什么,但我发誓有时候微软喜欢伤害他们的客户。这将很容易一劳永逸地解决,而且它将使某些事情变得更加容易。这简直让人难以置信。那么声明呢?
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);
    }
}