2012-05-14 4 views
0

Вопрос, который у меня есть, возможен либо в C# с использованием собственных или других API, либо в SQL Server для доступа к метаданным SQL-запроса.Получить метаданные запроса SQL Server

Поиск информации о схеме достаточно легко при работе со стандартным SELECT утверждением, но это становится все труднее, когда делать что-то вдоль линий:

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

Цель в том, чтобы узнать исходный столбец (s) для CountResult или даже просто утверждение, которое создало псевдоним.

+0

Хммм, почему-то я думаю, что вы спрашиваете больше, чем INFORMATION_SCHEMA.Columns and Tables. Откуда возникает исходный запрос? Можете ли вы привести пример источника столбца источника? –

+0

Заявление может быть любым. Мы просто хотим знать, как вытащить псевдоним столбца, а затем его источник. Это похоже на разбор, но я полагаю, что эту информацию можно получить из существующих ресурсов. Поэтому в приведенном выше экземпляре я хотел бы получить доступ к «ColumnResult» и узнать, что его создало. В этом случае это будет «COUNT (DISTINCT [ColumnA])». – nathantruant

+0

Я действительно хочу знать, какая схема для любого заданного оператора выбора будет выглядеть (форма), плюс для любого заданного псевдонима, откуда она появилась. – nathantruant

ответ

0

Это может помочь: SqlDataReader.GetSchemaTable();

+0

Это идеально подходит для получения итоговых имен столбцов из заданного запроса, но не для определения, откуда они получены, если они являются Псевдонимами. – nathantruant

+0

Извините, не читал достаточно внимательно, я думаю, не анализируя источник запроса - вы не можете получить то, что вам нужно, потому что после того, как SQL создает набор результатов, он не сохраняет исходную информацию о том, что было источником значений. Просто чтобы проиллюстрировать сложность: что бы вы вернули в своих метаданных для чего-то вроде «Sum (a.Amount * b.Qty)», если вы были SQL-сервером? –

+0

Право, что заставляет меня думать, что я могу быть вынужден пойти по пути разбора запроса на сложные случаи, такие как. Был надеяться избежать этого пути, если это возможно. Спасибо, сэр! – nathantruant

0

Динамическое управление Просмотров (DMVs) также обеспечивают довольно мало информации о системе. Чтобы получить быстрый список, вы можете запустить этот список запросов в этом blog. Названия DMV довольно понятны.

0

Не уверен, что это поможет, но вы можете получить некоторую информацию в плане выполнения. Например, выполните запрос с инструкцией SET SHOWPLAN_XML ON раньше. Он возвращает xml с подробной информацией об инструкции. Единственная проблема заключается в том, что есть много информации, поэтому ваш простой образец запроса получит такой код для списка выходных столбцов.

<OutputList> 
    <ColumnReference Column="Expr1234" /> 
</OutputList> 

Глядя на Expr1234 вы можете обнаружить, что результат Expr2345 отливают в целое:

<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