获取SQL Server查询元数据

时间:2012-05-14 21:47:23

标签: c# sql sql-server tsql metadata

我的问题是,是否可以使用本机或其他API在C#中或在SQL Server中访问SQL查询的元数据。

在处理标准SELECT语句时,查找架构信息很容易,但在执行以下操作时会变得更加困难:

SELECT COUNT(DISTINCT [ColumnA]) as 'CountResult' 
FROM MyTable

目标是找出CountResult的源列,或者甚至只找到创建别名的语句。

3 个答案:

答案 0 :(得分:0)

这可能有所帮助:SqlDataReader.GetSchemaTable();

答案 1 :(得分:0)

动态管理视图(DMV)还提供了相当多的系统信息。要获得快速列表,您可以在此blog中运行此查询列表。 DMV名称非常明显。

答案 2 :(得分:0)

不确定这会有所帮助,但您可以在执行计划中获得一些信息。例如,使用之前的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>

因此,如果您在查询中需要精确的列语句,则很难从计划中获取它。但是如果允许自定义格式,只是为了理解列中发生的事情,这种方式可能会有所帮助。