我的问题是是否可以在 C# 中使用本机或其他 API 或在 SQL Server 中访问 SQL 查询的元数据。
在处理标准语句时查找模式信息很容易SELECT
,但在执行以下操作时变得更加困难:
SELECT COUNT(DISTINCT [ColumnA]) as 'CountResult'
FROM MyTable
目标是找出CountResult
创建别名的语句的源列,甚至找出语句。
我的问题是是否可以在 C# 中使用本机或其他 API 或在 SQL Server 中访问 SQL 查询的元数据。
在处理标准语句时查找模式信息很容易SELECT
,但在执行以下操作时变得更加困难:
SELECT COUNT(DISTINCT [ColumnA]) as 'CountResult'
FROM MyTable
目标是找出CountResult
创建别名的语句的源列,甚至找出语句。
这可能会有所帮助:SqlDataReader.GetSchemaTable();
动态管理视图 (DMV) 还提供了相当多的系统信息。要获取快速列表,您可以在此博客中运行此查询列表。DMV 的名称是不言自明的。
不确定这是否有帮助,但您可以在执行计划中获得一些信息。例如,之前使用 SET SHOWPLAN_XML ON 语句执行您的查询。它返回包含有关语句的详细信息的 xml。唯一的问题是,有很多信息,所以您的简单查询示例将获得这样的输出列列表代码。
<OutputList>
<ColumnReference Column="Expr1234" />
</OutputList>
通过查看 Expr1234,您可以发现 Expr2345 的结果被转换为 int:
<ColumnReference Column="Expr1234" />
<ScalarOperator ScalarString="CONVERT_IMPLICIT(int,[Expr2345],0)">
<Convert DataType="int" Style="0" Implicit="1">
<ScalarOperator>
<Identifier>
<ColumnReference Column="Expr2345" />
</Identifier>
</ScalarOperator>
</Convert>
</ScalarOperator>
下一步将是找到 Expr2345,您可以在其中得到:
<ColumnReference Column="Expr2345" />
<ScalarOperator ScalarString="Count(*)">
<Aggregate AggType="countstar" Distinct="0" />
</ScalarOperator>
因此,如果您需要与查询中一样的精确列语句,则很难从计划中获取它。但是,如果允许自定义格式,只是为了了解列中发生的情况,这种方式可能会有所帮助。