Современные программы состоят из плоских частей, но действительно ли они являются плоскими? Существуют использования, и включает, и библиотеки объектов, и т.д. Вызов обычной функции является быстрым взглядом в различное место. Логика не является плоской, из-за наличия нескольких потоков, и т.д.
Я нашел способ использовать SMO:
Server srv;
srv = new Server("ServerName");
Database db;
db = srv.Databases["MyDatabase"];
var Params = db.StoredProcedures["MyStoredProc"].Parameters;
foreach(StoredProcedureParameter param in Params) {
Console.WriteLine(param.Name + "-" + param.DefaultValue);
}
Не имеет большое значение в SQL Server 2005 и более поздних версиях:
SELECT
pa.NAME,
t.name 'Type',
pa.max_length,
pa.has_default_value,
pa.default_value
FROM
sys.parameters pa
INNER JOIN
sys.procedures pr ON pa.object_id = pr.object_id
INNER JOIN
sys.types t ON pa.system_type_id = t.system_type_id
WHERE
pr.Name = 'YourStoredProcName'
К сожалению, хотя это и казалось несложным - это не работает: - (
Из Technet:
SQL Server поддерживает только значение по умолчанию значения для объектов CLR в этом каталоге Посмотреть; поэтому в этом столбце значение 0 для объектов Transact-SQL . Чтобы просмотреть значение по умолчанию для параметр в объекте Transact-SQL, запросить столбец определения sys.sql_modules представление каталога или используйте системная функция OBJECT_DEFINITION.
Таким образом, все, что вы можете сделать, это либо запросить sys.sql_modules
, либо вызвать SELECT object_definition (object_id)
, чтобы получить определение SQL (источник T-SQL code) для вашей сохраненной процедуры, а затем вам нужно будет разобрать это ( отстой !! большое время .....)
Похоже, что другого способа сделать это действительно нет ... Я Я поражен и потрясен .....
Может быть, в SQL Server 2008 R2? :-) Марк
For stored procedures, I believe you would have to write something that parses T-SQL, or use the T-SQL parser that Microsoft provides.
The parser and script generator live in two assemblies. The
Microsoft.Data.Schema.ScriptDom
contains provider agnostic classes and theMicrosoft.Data.Schema.ScriptDom.Sql
assembly contain classes for the parser and script generator that are SQL Server specific.
How to specifically use this to identify the parameters and whether they're defaulted isn't covered and would be something you'd have to work on (probably with a deal of effort) using the sample code.
Это своего рода хак, но вы всегда можете просто дать необязательным параметрам специальное имя, например:
@AgeOptional = 15
... затем написать простой метод, который проверяет параметр, чтобы увидеть, является ли он необязательным. Не идеально, но, учитывая ситуацию, это действительно может быть достойным решением.