使用SYS或INFORMATION_SCHEMA表发现SQL Server过程缺省参数

时间:2012-03-23 11:31:08

标签: sql sql-server stored-procedures parameters optional-parameters

与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中从sysINFORMATION_SCHEMA表中进行选择?我在INFORMATION_SCHEMA.PARAMETERS中看不到任何有用的列,sys.parameters.has_default_value似乎没有正确设置(!)

注意,我已经问过关于DB2的类似问题:

Discover DB2 procedure default parameters using SYSCAT tables

1 个答案:

答案 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日。