2013-09-03 12 views
2

Я написал расширение DbContext, чтобы попытаться определить, существует ли хранимая процедура в его связанной базе данных.C# - Определение наличия хранимой процедуры

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 работает должным образом, возвращая одну строку, если хранимая процедура существует, и нет строк, если это не так.

Есть ли у кого-нибудь идеи о том, как достичь этого (программно определить, существует ли хранимая процедура с базой данных)?

Благодаря Роб

+1

Я настоятельно рекомендую использовать ** более сфокусированные ** представления каталога и избежать 'sys.objects' как только возможно. Ваш запрос будет легче читать и понимать, если вы используете 'SELECT .. FROM sys.procedures WHERE ....' –

ответ

5

Спасибо за помощь ... В конце концов, я получил его на работу следующим образом:

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

вы можете сделать хранимую процедуру, и отправить имя в порядке, в качестве параметра, чтобы проверить, если он существует

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

и называют эту процедуру из кода до вашей логики.

+0

Спасибо за ответ. Я стараюсь избегать любых зависимостей. Я планирую сохранить его как можно более универсальным для моей базовой библиотеки. –

+0

Я не знаю, верно ли это здесь или нет, но executesqlcommand не поможет вам здесь, так как он возвращает результат, возвращаемый базой данных после выполнения команды. поскольку нет выходных параметров или возвращаемого целого числа, этот оператор ведет себя так, как ожидалось. попробуйте выполнить скалярную команду. –

Смежные вопросы