What are all the functions and their parameters?
File this one under: I wrote it once, may I never need it again
In my ever expanding quest for getting all the metadata, I how could I determine the metadata for all my table valued functions? No problem, that's what sys.dm_exec_describe_first_result_set is for. SELECT * FROM sys.dm_exec_describe_first_result_set(N'SELECT * FROM dbo.foo(@xmlMessage)', N'@xmlMessage nvarchar(max)', 1) AS DEDFRS
Except, I need to know parameters. And I need to know parameter types. And order. Fortunately, sys.parameters and sys.types makes this easy. The only ugliness comes from the double invocation of row rollups
SELECT
CONCAT
(
''
, 'SELECT * FROM '
, QUOTENAME(S.name)
, '.'
, QUOTENAME(O.name)
, '('
-- Parameters here without type
, STUFF
(
(
SELECT
CONCAT
(
''
, ','
, P.name
, ' '
)
FROM
sys.parameters AS P
WHERE
P.is_output = CAST(0 AS bit)
AND P.object_id = O.object_id
ORDER BY
P.parameter_id
FOR XML PATH('')
)
, 1
, 1
, ''
)
, ') AS F;'
) AS SourceQuery
, (
STUFF
(
(
SELECT
CONCAT
(
''
, ','
, P.name
, ' '
, CASE
WHEN T2.name LIKE '%char' THEN CONCAT(T2.name, '(', CASE P.max_length WHEN -1 THEN 'max' ELSE CAST(P.max_length AS varchar(4)) END, ')')
WHEN T2.name = 'time' OR T2.name ='datetime2' THEN CONCAT(T2.name, '(', P.scale, ')')
WHEN T2.name = 'numeric' THEN CONCAT(T2.name, '(', P.precision, ',', P.scale, ')')
ELSE T2.name
END
)
FROM
sys.parameters AS P
INNER JOIN
sys.types AS T2
ON T2.user_type_id = P.user_type_id
WHERE
P.is_output = CAST(0 AS bit)
AND P.object_id = O.object_id
ORDER BY
P.parameter_id
FOR XML PATH('')
)
, 1
, 1
, ''
)
) AS ParamterList
FROM
sys.schemas AS S
INNER JOIN
sys.objects AS O
ON O.schema_id = S.schema_id
WHERE
O.type IN ('FT','IF', 'TF');
How you use this is up to you. I plan on hooking it into the Biml Query Table Builder to simulate tables for all my TVFs.
No comments:
Post a Comment