Получение скрипта и параметров хранимой процедуры отдельно - PullRequest
0 голосов
/ 15 марта 2012

Я хочу получить доступ к скрипту хранимой процедуры, используя C #.

Я использовал EXEC sp_HelpText STOREDPROCNAME. Это работает нормально.

Есть ли способ отдельно извлечь запрос хранимой процедуры и параметр хранимой процедуры ??

Пример: мне нужно:

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

и

@ID numeric(18,0)

отдельно.

Как это сделать?

Ответы [ 3 ]

3 голосов
/ 15 марта 2012

Самый простой способ - напрямую запросить у БД SqlCommandBuilder.DeriveParameters

Извлекает информацию о параметрах из хранимой процедуры, указанной в SqlCommand, и заполняет коллекцию Parameters указанногоSqlCommand объект.

Существует также

exec [dbname].[sys].[sp_procedure_params_rowset] @procedure_name=N'uspblabla'

, источник которого вы можете увидеть через sp_helptext sp_procedure_params_rowset.

2 голосов
/ 15 марта 2012

Таким способом вы можете получить тело, но нет способа разобрать отдельные утверждения:

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

Обратите внимание, что без анализа методом перебора определения невозможно определить, имеют ли параметры значение по умолчанию и, если они имеют, какое значение по умолчанию. Вы лучше подготовлены к тому, чтобы делать это в C #, используя RegEx или другие методы синтаксического анализа.

1 голос
/ 15 марта 2012

Вы можете добавить ссылку на 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);
    }
}

Дополнительную информацию можно найти Здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...