Как я могу определить, имеет ли параметр хранимой процедуры SQL Server значение по умолчанию?

Современные программы состоят из плоских частей, но действительно ли они являются плоскими? Существуют использования, и включает, и библиотеки объектов, и т.д. Вызов обычной функции является быстрым взглядом в различное место. Логика не является плоской, из-за наличия нескольких потоков, и т.д.

9
задан GuyBehindtheGuy 4 November 2009 в 20:05
поделиться

5 ответов

Я нашел способ использовать 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);
}
14
ответ дан 4 December 2019 в 08:33
поделиться

Не имеет большое значение в 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? :-) Марк

6
ответ дан 4 December 2019 в 08:33
поделиться

Запустить встроенную хранимую процедуру sp_help ?

1
ответ дан 4 December 2019 в 08:33
поделиться

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 the Microsoft.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.

1
ответ дан 4 December 2019 в 08:33
поделиться

Это своего рода хак, но вы всегда можете просто дать необязательным параметрам специальное имя, например:

@AgeOptional = 15

... затем написать простой метод, который проверяет параметр, чтобы увидеть, является ли он необязательным. Не идеально, но, учитывая ситуацию, это действительно может быть достойным решением.

1
ответ дан 4 December 2019 в 08:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: