如何在 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.columnssys.types 反正

以上是关于如何在 SQL Server 中获取用户定义的表值函数的结果形状? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server存储过程中使用表值作为输入参数示例

如何在 Python 中使用表值参数访问 SQL Server 2008 存储过程

SQL Server中CLR表值函数(table-valued function)不能使用WITH(NOLOCK)

sql server表值函数和视图如何一起使用

为啥需要以只读方式输入 SQL Server 存储过程的表值参数?

SQL Server 2008R2 用户定义函数(表值)性能