これは、デフォルト値が存在するかではない特定のパラメータであり、場合でも、パラメータのデフォルト値を見つけるために何の些細な方法はありませんMicrosoft has neglected this topicこととなります。
我々はすべて知っているように、T-SQLストアドプロシージャは、パラメータのデフォルト値は、sys.parameters、all_parameters、system_parametersに格納されている ではありません。また、 は、sp_sproc_columns、sys.columns、または sp_procedure_params_rowsetによって公開されません。
マイクロソフトからのフィードバック:
SQL Serverが唯一 このカタログビューでCLRオブジェクトのデフォルト値を維持」というティボーKaraszi、BOLの文書が掲示するとおり、 そのため、この列には値を持っています0 Transact-SQLオブジェクトの場合 Transact-SQLオブジェクトのパラメータの既定値を表示するには、 sys.sql_modulesカタログビューの定義列を照会するか、 OBJECT_DEFINITIONシステム関数を使用してください。
ユーコンでは、パラメータがデフォルトで の値であることもビットを保存しません。
私は、最初のコードスニペットin this answerをテストしてきたし、それはあなたの簡単な例のために働くようだ:
SELECT
data3.name
, [default_value] = REVERSE(RTRIM(SUBSTRING(
data3.rtoken
, CASE
WHEN CHARINDEX(N',', data3.rtoken) > 0
THEN CHARINDEX(N',', data3.rtoken) + 1
WHEN CHARINDEX(N')', data3.rtoken) > 0
THEN CHARINDEX(N')', data3.rtoken) + 1
ELSE 1
END
, LEN(data3.rtoken)
)))
FROM (
SELECT
data2.name
, rtoken = REVERSE(
SUBSTRING(ptoken
, CHARINDEX('=', ptoken, 1) + 1
, LEN(data2.ptoken))
)
FROM (
SELECT
data.name
, ptoken = SUBSTRING(
data.tokens
, token_pos + name_length + 1
, ISNULL(ABS(next_token_pos - token_pos - name_length - 1), LEN(data.tokens))
)
FROM (
SELECT
sm3.tokens
, p.name
, name_length = LEN(p.name)
, token_pos = CHARINDEX(p.name, sm3.tokens)
, next_token_pos = CHARINDEX(p2.name, sm3.tokens)
FROM (
SELECT
sm2.[object_id]
, sm2.[type]
, tokens = REVERSE(SUBSTRING(sm2.tokens, ISNULL(CHARINDEX('SA', sm2.tokens) + 2, 0), LEN(sm2.tokens)))
FROM (
SELECT
sm.[object_id]
, o.[type]
, tokens = REVERSE(SUBSTRING(
sm.[definition]
, CHARINDEX(o.name, sm.[definition]) + LEN(o.name) + 1
, ABS(CHARINDEX(N'AS', sm.[definition]))
)
)
FROM sys.sql_modules sm WITH (NOLOCK)
JOIN sys.objects o WITH (NOLOCK) ON sm.[object_id] = o.[object_id]
JOIN sys.schemas s WITH (NOLOCK) ON o.[schema_id] = s.[schema_id]
WHERE o.[type] = 'P '
AND s.name + '.' + o.name = 'dbo.Sample1'
) sm2
WHERE sm2.tokens LIKE '%=%'
) sm3
JOIN sys.parameters p WITH (NOLOCK) ON sm3.[object_id] = p.[object_id]
OUTER APPLY (
SELECT p2.name
FROM sys.parameters p2 WITH (NOLOCK)
WHERE p2.is_output = 0
AND sm3.[object_id] = p2.[object_id]
AND p.parameter_id + 1 = p2.parameter_id
) p2
WHERE p.is_output = 0
) data
) data2
WHERE data2.ptoken LIKE '%=%'
) data3
しかし、それは1つが簡単にシステムのビューから照会可能されることを想定していたタスクのために本当に醜いです。
[悪い習慣をキックする:古いスタイルを使用してJOINを](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old ANSI - ** 92 ** SQL標準(** 25年*)の*適切な* ANSI 'JOIN'構文で置き換えられた*スタイルのコンマで区切られたテーブル* *前)、その使用は推奨されません –