2012-03-15 3 views
-1

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

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

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

например: мне нужно:

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

и

@ID numeric(18,0) 

отдельно.

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

ответ

2

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

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 или другие методы синтаксического анализа.

+0

часть параметра работает нормально. как и сказал, что часть заявления идет, как есть. Любой другой способ? по крайней мере, в коде C#? – Olivarsham

+1

К сожалению, поскольку существует так много стилей синтаксиса, вам будет очень сложно определить, где начинается и заканчивается тело процедуры, и где начинаются и заканчиваются отдельные утверждения в рамках процедуры. Продолжайте и напишите RegEx, который вытаскивает из одной инструкции из процедуры, и я напишу процедуру, которая ее сломает. :-) –

+0

Безумно, что это возвращает столбцы [has_default_value] и [default_value], но они не заполняются. Кажется, вам нужно использовать объекты SMO для получения этой информации. – tbone

2

Самый простой способ это спросить дб непосредственно с SqlCommandBuilder.DeriveParameters

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

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

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

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

+0

то как насчет утверждения? – Olivarsham

+0

sp_helptext после AS? –

1

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

Дополнительная информация может быть найдена Here

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