【问题标题】:C# - Determining if a Stored Procedure exists [duplicate]C# - 确定存储过程是否存在
【发布时间】:2013-09-07 08:04:24
【问题描述】:

我编写了一个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
    }

问题是:不管存储过程name是否存在,我的exists变量(从ExecSqlCommand返回)总是包含'-1'。所以我无法确定存储过程是否在数据库中。

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

是否有人对如何实现这一点有任何想法(以编程方式确定数据库中是否存在存储过程)?

谢谢 抢

【问题讨论】:

  • 我强烈建议使用更有针对性的目录视图,并尽可能避免使用sys.objects。如果您使用SELECT .. FROM sys.procedures WHERE ....,您的查询将更容易阅读和理解

标签: c# sql-server stored-procedures dbcontext exists


【解决方案1】:

感谢您的帮助...最后我让它工作如下:

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

【讨论】:

    【解决方案2】:

    你可以做一个存储过程,并将过程的名称作为参数发送来检查它是否存在

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

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

    【讨论】:

    • 感谢您的回复。我试图避免有任何依赖。我计划在我的基础库中尽可能保持通用性。
    • 我不知道我在这里是否正确,但是executesqlcommand不会在这里帮助你,因为它在执行命令后返回数据库返回的结果。由于没有输出参数也没有返回整数,因此该语句的行为符合预期。尝试执行标量命令。
    猜你喜欢
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 2011-03-28
    • 1970-01-01
    • 2011-08-08
    • 2010-09-08
    • 1970-01-01
    相关资源
    最近更新 更多