2012-05-14 82 views
0

我有的問題是在C#中使用本機或其他API或SQL Server中是否可以訪問SQL查詢的元數據。獲取SQL Server查詢元數據

尋找模式的信息是很容易的用標準SELECT聲明打交道時,但這樣做的線沿線的東西時,就變得更困難:

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

,目的是爲了找出源列(S )爲CountResult,甚至只是創建別名的語句。

+0

嗯,不知何故,我想你問的不僅僅是INFORMATION_SCHEMA.Columns和Tables。原始查詢來自哪裏?你能舉一個源列的例子嗎? –

+0

聲明可以是任何東西。我們只想知道如何提取列別名及其來源。有點像解析,但我認爲這些信息可以從現有資源獲得。所以在上面的例子中,我想訪問'ColumnResult'並找出它創建的內容。在這種情況下,它將是'COUNT(DISTINCT [ColumnA])'。 – nathantruant

+0

我真的很想知道任何給定select語句的Schema看起來是什麼樣子(形狀),加上任何給定的別名,它來自哪裏。 – nathantruant

回答

0

這可能會幫助:SqlDataReader.GetSchemaTable();

+0

這非常適合從給定查詢中獲取結果列名,但不適用於查找它們來自哪裏,如果它們是別名。 – nathantruant

+0

對不起,沒有仔細閱讀,我認爲沒有分析查詢源 - 你不能得到你所需要的,因爲在SQL創建結果集後,它不保留關於什麼是源的值的源信息。只是爲了說明覆雜性:如果你是SQL服務器,你會在元數據中返回什麼樣的東西,比如'Sum(a.Amount * b.Qty)'? –

+0

正確的,這讓我覺得我可能會被迫去解析這種複雜情況的查詢路線。如果可能的話,希望避開那條路。謝謝先生! – nathantruant

0

動態管理視圖(DMV)也提供了相當多的系統信息。要獲得快速列表,您可以在此blog中運行此查詢列表。 DMV名稱非常明瞭。

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> 

所以,如果你需要精確的列語句,因爲它在查詢中,它將很難從計劃中得到它。但是,如果自定義格式允許,爲了理解列中發生的情況,這種方式可能會有所幫助。

+0

這是一個非常有趣的方法。謝謝一堆。 – nathantruant