如何在 SQL Server 中获取用户定义的表值函数的结果形状? [复制]
Posted
技术标签:
【中文标题】如何在 SQL Server 中获取用户定义的表值函数的结果形状? [复制]【英文标题】:How do I get the result shape of a user defined table valued function in SQL Server? [duplicate] 【发布时间】:2021-04-28 15:09:19 【问题描述】:“结果形状”是指函数返回的列名和数据类型的列表。通过存储过程,我可以使用sys.dm_exec_describe_first_result_set_for_object
:
SELECT name, system_type_name
FROM sys.dm_exec_describe_first_result_set_for_object
(
OBJECT_ID('[dbo].[MyProcedureName]'),
NULL
);
但是,如果我用表值函数的名称调用该系统函数,我只会得到 null。
有没有办法对表值函数做同样的事情?
【问题讨论】:
应该在 sys.columns - 就像视图或表格一样。我会注意到您编写了“用户定义的表值函数”,但您的示例暗示了“存储过程”。 【参考方案1】:不能在这种情况下使用表函数,因为它没有固有的“结果”,它本质上是一个参数化视图。
sys.columns
拥有您需要的所有详细信息
SELECT c.name, t.name as system_type_name
FROM sys.columns c
JOIN sys.types t ON t.user_type_id = c.user_type_id
WHERE c.object_id = OBJECT_ID('[dbo].[MyProcedureName]');
另一种选择:您可以在批处理上使用dm_exec_describe_first_result_set
。
注意,必要时需要填写参数。他们可能只是default
。
SELECT name, system_type_name
FROM sys.dm_exec_describe_first_result_set
(
'select * from [dbo].[MyProcedureName]()',
NULL,
1
);
-- for parameters:
SELECT name, system_type_name
FROM sys.dm_exec_describe_first_result_set
(
'select * from [dbo].[MyProcedureName2](default, default)',
NULL,
1
);
如果不知道参数多少,可以用一点动态SQL:
DECLARE @sql nvarchar(max) = N'SELECT * FROM ' + QUOTENAME(@functionName) + N'(' +
(
SELECT STRING_AGG(N'DEFAULT', N',')
FROM sys.parameters p
WHERE p.object_id = OBJECT_ID(@functionName)
) + N')';
SELECT name, system_type_name
FROM sys.dm_exec_describe_first_result_set
(
@sql,
NULL,
1
);
【讨论】:
嗯...但这需要我实际调用存储过程或函数。其中一些可能会产生副作用,我不想仅仅为了检查结果集而发生这种情况,而且我需要为每个参数输入虚拟值。dm_exec_describe_first_result_set
实际上并没有执行任何操作,它只是返回它认为的第一个结果集。您可以为每个参数传递null
,除了 TVP,因此可以将其更改为 default
@ekolis 看起来你可以使用sys.columns
和sys.types
反正以上是关于如何在 SQL Server 中获取用户定义的表值函数的结果形状? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Python 中使用表值参数访问 SQL Server 2008 存储过程
SQL Server中CLR表值函数(table-valued function)不能使用WITH(NOLOCK)