Как я могу получить список таблиц в базе данных SQL Server вместе с первичным ключом, используя только C #? - PullRequest
5 голосов
/ 23 августа 2010

Учитывая базу данных, как я могу получить список таблиц вместе с первичным ключом каждой таблицы?

Спасибо.

Редактировать: Это для инструмента генерации кода, который я делаю, мне нужно как-то запустить скрипт SQL, используя только C #.

Ответы [ 4 ]

6 голосов
/ 23 августа 2010

Сам по себе T-SQL не использует. Он генерирует его сам по себе, но не будет столь же эффективным, как просто использование точного короткого T-SQL, который получит ту же информацию.

using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;

public class LoadStuff
{
    string mDatabaseConnectionString = "Something";
    ...
    public void LoadDatabase(string tDatabaseName)
    {
        using (var vSqlConnection = new SqlConnection(mDatabaseConnectionString))
        {
            var vConnection = new ServerConnection(vSqlConnection);
            var vServer = new Server(vConnection);
            var vDatabase = vServer.Databases[tDatabaseName];
            var vTables = vDatabase.Tables;
        }
    }
}

Каждый из Объектов в коллекции "vTables" будет определением для Таблицы в этой базе данных с именем vDatabaseName.

Эта таблица будет иметь коллекцию столбцов, и первичные ключи можно найти в цикле через свойство «Столбцы» каждой таблицы. Любые столбцы в первичном ключе будут иметь свойство InPrimaryKey, помеченное как true.

Также вы должны получить всю информацию о различных объектах ДО конца блока использования. Я занимался созданием мини-классов, в которых была только та информация, которая мне была нужна после завершения всего процесса, но вы, вероятно, могли бы просто выплюнуть код из генерации кода.

3 голосов
/ 23 августа 2010

Вот один ответ:

select 
    t.Table_Name,
    tc.Constraint_Name,
    ccu.Column_Name
from
    information_schema.tables t
    left join information_schema.table_constraints tc
        on tc.Table_Catalog = t.Table_Catalog
        and tc.Table_Name = t.Table_Name
        and tc.Constraint_Type = 'PRIMARY KEY'
    left join information_schema.constraint_column_usage ccu
        on ccu.Table_Catalog = tc.Table_Catalog
        and ccu.Table_Name = tc.Table_Name
        and ccu.Constraint_Schema = tc.Constraint_Schema
        and ccu.Constraint_Name = tc.Constraint_Name
order by
    t.Table_Name,
    tc.Constraint_Name,
    ccu.Column_Name

Здесь будут перечислены таблицы, ограничения их первичного ключа и столбцы в этих ограничениях.Обратите внимание, что если первичный ключ имеет несколько столбцов, для этого столбца будет несколько записей.Также обратите внимание, что этот запрос также возвращает представления.

1 голос
/ 23 августа 2010

Вот начало (SQL 2005 и выше):

SELECT ta.name TableName, ind.name IndexName
 from sys.tables ta
  left outer join sys.indexes ind
   on ind.object_id = ta.object_id
    and ind.is_primary_key = 1

Для таблиц без первичных ключей IndexName имеет значение Null.

Но это просто список имен первичного ключа. Вам нужен список столбцов в ключе?

- ДОБАВЛЕНО ----------------

Вот часть утилиты, которую я однажды написал. Это перечислит все таблицы и столбцы в порядке всех существующих первичных ключей:

SELECT ta.name TableName, ind.name IndexName, indcol.key_ordinal IndexColumnOrder, col.name ColumnName
 from sys.tables ta
  left outer join sys.indexes ind
   on ind.object_id = ta.object_id
    and ind.is_primary_key = 1
  left outer join sys.index_columns indcol
   on indcol.object_id = ta.object_id
    and indcol.index_id = ind.index_id
  left outer join sys.columns col
   on col.object_id = ta.object_id
    and col.column_id = indcol.column_id
 order by
   ta.Name
  ,indcol.key_ordinal

Взломав это, в следующем списке будут перечислены все (и только) таблицы с первичными ключами только одного столбца:

SELECT ta.name TableName, max(col.name) ColumnName
 from sys.tables ta
  inner join sys.indexes ind
   on ind.object_id = ta.object_id
    and ind.is_primary_key = 1
  inner join sys.index_columns indcol
   on indcol.object_id = ta.object_id
    and indcol.index_id = ind.index_id
  inner join sys.columns col
   on col.object_id = ta.object_id
    and col.column_id = indcol.column_id
 group by ta.name
 having count(*) = 1
 order by ta.Name

Что касается преобразования этого в C # (не моя сильная сторона), вы должны иметь возможность сделать это хранимой процедурой или просто создать и отправить запрос из своего кода.

0 голосов
/ 23 августа 2010

Вы используете объект SQLCommand для выполнения t-sql для базы данных ..

Здесь описано множество примеров на c # и других языках: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx

Или вы подразумеваете непосредственноиспользуя CLR, встроенный в SQL-сервер?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...