与Oracle一样,SQL Server支持存储过程中的参数默认值。 Oracle语法:
CREATE OR REPLACE PROCEDURE p_default (
p_in_number IN number := 0,
p_out_number OUT number,
p_in_varchar IN varchar2 := '0',
p_out_varchar OUT varchar2,
p_in_date IN date := date '1981-07-10',
p_out_date OUT date
)
SQL Server语法:
CREATE PROCEDURE p_default (
@p_in_number INTEGER = 0,
@p_out_number INTEGER OUT,
@p_in_varchar VARCHAR(10) = '0',
@p_out_varchar VARCHAR(10) OUT,
@p_in_date DATE = '1981-07-10',
@p_out_date DATE OUT
)
使用Oracle,我可以使用此查询发现默认值:
SELECT argument_name, defaulted FROM all_arguments WHERE object_id = :proc_id
如何在SQL Server中从sys
或INFORMATION_SCHEMA
表中进行选择?我在INFORMATION_SCHEMA.PARAMETERS
中看不到任何有用的列,sys.parameters.has_default_value
似乎没有正确设置(!)
注意,我已经问过关于DB2的类似问题:
Discover DB2 procedure default parameters using SYSCAT tables
答案 0 :(得分:4)
没有简单的方法可以做到这一点。正如documentation for has_default_value
所述:
SQL Server仅在此目录视图中维护CLR对象的默认值;因此,对于Transact-SQL对象,此列的值为0。要查看Transact-SQL对象中参数的默认值,请查询
definition
目录视图的sys.sql_modules
列,或使用OBJECT_DEFINITION
系统函数。
所以你必须将整个存储过程定义拉出来并自己解析它以确定值。
旁注:我对@p_in_date DATE = '1981-07-10'
持谨慎态度。我知道date
数据类型比datetime
更明智,但我不确定上述内容是否仍然含糊不清 - 当然如果转换为datetime
,可能会导致根据语言设置,在7月10日或10月7日。我对'19810710'
感到更舒服,这将永远被解释为7月10日。