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);
}
在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对象的默认值 ; 因此,对于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中?:-)马克