如何确定SQL Server存储过程参数是否具有默认值?

Guy*_*Guy 9 .net sql-server stored-procedures

有没有办法以编程方式确定SQL Server存储过程参数是否具有默认值?(如果您可以确定默认值是什么,则可以获得奖励.) SqlCommandBuilder.DeriveParameters()甚至不尝试.

在此先感谢您的帮助!

编辑:老实说,我不在乎它是一个SQL查询,一个SMO对象,等等.

Guy*_*Guy 14

我发现了一种使用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);
}
Run Code Online (Sandbox Code Playgroud)


mar*_*c_s 6

在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'
Run Code Online (Sandbox Code Playgroud)

不幸的是,即使这看起来像一块蛋糕 - 它不起作用:-(

来自Technet:

SQL Server 在此目录视图中维护CLR对象的默认 ; 因此,对于Transact-SQL对象,此列的 值为0.要查看Transact-SQL对象中参数的默认值,请查询sys.sql_modules目录视图的定义列,或使用OBJECT_DEFINITION系统函数.

所以你所能做的就是查询sys.sql_modules或调用SELECT object_definition(object_id)基本上为你的存储过程获取SQL定义(T-SQL源代码),然后你需要解析它(糟透了!大时间.....)

好像没有其他方法可以做到这一点...我很惊讶并且应用.....

也许在SQL Server 2008 R2中?:-)马克

  • 哇.推荐的方法是_parse存储过程的主体_ ?! 太糟糕了. (3认同)