C# C-确定存储过程是否存在

C# C-确定存储过程是否存在,c#,sql-server,stored-procedures,dbcontext,exists,C#,Sql Server,Stored Procedures,Dbcontext,Exists,我编写了一个DbContext扩展来尝试并确定存储过程是否存在于其关联的数据库中 public static bool StoredProcedureExists(this DbContext input, string name) { int exists = input.Database.ExecuteSqlCommand(string.Format("SELECT TOP 1 * FROM [sys].[objects] WHERE [type_desc]

我编写了一个DbContext扩展来尝试并确定存储过程是否存在于其关联的数据库中

    public static bool StoredProcedureExists(this DbContext input, string name)
    {
        int exists = input.Database.ExecuteSqlCommand(string.Format("SELECT TOP 1 * FROM [sys].[objects] WHERE [type_desc] = 'SQL_STORED_PROCEDURE' AND [name] = '{0}';", name));

        //return true; // if it exists, else false
    }
问题是:无论存储过程名称是否存在,从ExecSqlCommand返回的myexists变量始终包含“-1”。因此,我无法确定存储过程是否在数据库中

在SQLServerManagementStudio中执行生成的查询按预期工作,如果存储过程存在,则返回一行,如果不存在,则不返回任何行

有人对如何通过编程实现这一点有什么想法吗?确定数据库中是否存在存储过程

谢谢
Rob

您可以执行一个存储过程,并将该过程的名称作为参数发送,以检查它是否存在

               SELECT [schema] = OBJECT_SCHEMA_NAME([object_id]),
                       name
               FROM sys.procedures;
               WHERE name = @param_proc_name

并在逻辑之前从代码调用该过程。

谢谢您的帮助。。。最后,我让它按如下方式工作:

    public static bool StoredProcedureExists(this DbContext input, string name)
    {
        var query = input.Database.SqlQuery(
            typeof(int), 
            string.Format("SELECT COUNT(*) FROM [sys].[objects] WHERE [type_desc] = 'SQL_STORED_PROCEDURE' AND [name] = '{0}';", name), 
            new object[] {});

        int exists = query.Cast<int>()
            .Single();

        return (exists > 0);
    }

谢谢你的回复。我试图避免任何依赖关系。我计划在我的基本库中尽可能地保持它的通用性。我不知道我在这里是否正确,但是executesqlcommand在这里不会帮助您,因为它会在执行命令后返回数据库返回的结果。由于既没有输出参数,也没有返回的整数,因此此语句的行为与预期一致。尝试执行标量命令。我强烈建议使用更集中的目录视图,尽可能避免使用sys.objects。如果使用SELECT,您的查询将更易于阅读和理解。。从sys.procedures,其中。。。。