.net 如何使用FMTONLY获取基表名称

.net 如何使用FMTONLY获取基表名称,.net,sql-server,tsql,.net,Sql Server,Tsql,我有一个工具,可以通过以下操作获取有关存储过程的元数据: SET NO_BROWSETABLE ON; SET FMTONLY ON; EXEC {ProcName} {ProcParams} 传递进程名和伪(null)参数 我将其加载到一个数据表中,并调用GetSchemaTable,以确定生成的列名和数据类型。这很有效 但是我注意到,没有任何方法可以告诉每个列的源是哪个数据库表,我的应用程序也需要这个。有办法做到这一点吗 (我也不喜欢以这种方式获取元数据,因此我愿意接受以完全不同的方式获

我有一个工具,可以通过以下操作获取有关存储过程的元数据:

SET NO_BROWSETABLE ON; 
SET FMTONLY ON;
EXEC {ProcName} {ProcParams}
传递进程名和伪(null)参数

我将其加载到一个数据表中,并调用
GetSchemaTable
,以确定生成的列名和数据类型。这很有效

但是我注意到,没有任何方法可以告诉每个列的源是哪个数据库,我的应用程序也需要这个。有办法做到这一点吗

(我也不喜欢以这种方式获取元数据,因此我愿意接受以完全不同的方式获取元数据的建议。)

您可以尝试获取有关结果集的所有元数据。使用SQL Server 2012+

DECLARE @tsql NVARCHAR(MAX) = 
  N'select a.PartId , a.PartName , b.GroupName 
from Parts as a inner join Groups as b 
on a.GroupRef = b.GroupId';

SELECT name AS [Columns]
FROM sys.dm_exec_describe_first_result_set(@tsql, NULL, 1)
这同样适用于:

SELECT *
FROM sys.dm_exec_describe_first_result_set(N'EXEC dbo.procedure_name', NULL, 1);

请记住,这是有限制的。

您应该能够在元数据中获取源SQL——然后对表和字段名称进行解析。这是没有办法的,而且列不一定是从单个表或任何表派生的。考虑列<代码> Tabel.Value/TabelB.Tobe作为百分比列< /代码> -该列的源表是什么?或者,您可以在一个
联合中有多个表,因此在此场景中也可能有多个表。您可能需要说明为什么需要知道每列的源表,并找到解决此问题的方法。@Hogan:这难道不意味着编写完整的t-SQL语法分析器是一项非常艰巨的工作吗?@JoshuaFrank-这是一个通用的解决方案。它可能不适用于特定的解决方案。这完全取决于存储过程的内容。例如,如果每个存储过程都有这样一条注释:
——源表:TabA、TabB、TabC
,那么就很容易了。