使用 SYS 或 INFORMATION_SCHEMA 表发现 SQL Server 过程默认参数

Luk*_*der 0 sql sql-server parameters stored-procedures optional-parameters

与 Oracle 一样,SQL Server 支持存储过程中的参数默认值。甲骨文语法:

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

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

使用 Oracle,我可以使用以下查询发现默认值:

SELECT argument_name, defaulted FROM all_arguments WHERE object_id = :proc_id
Run Code Online (Sandbox Code Playgroud)

如何在 SQL Server 中选择sysINFORMATION_SCHEMA表中发现这一点?我在 中没有看到任何有用的列INFORMATION_SCHEMA.PARAMETERS,而且sys.parameters.has_default_value似乎没有正确设置 (!)

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

使用 SYSCAT 表发现 DB2 过程默认参数

Dam*_*ver 5

没有简单的方法可以做到。正如文档has_default_value所述:

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

因此,您必须提取整个存储的 proc 定义并自己解析它以确定值。


旁注:我会警惕@p_in_date DATE = '1981-07-10'. 我知道date数据类型比 更合理datetime,但我不确定上面是否仍然不明确 - 当然如果它被转换为datetime,它可能会导致 7 月 10 日或 10 月 7 日,具体取决于语言设置。我会更舒服,'19810710'这将始终被解释为 7 月 10 日。