Как программно скопировать таблицу в SQL Server без данных? - PullRequest
7 голосов
/ 01 августа 2009

Мне нужно скопировать таблицу, которая у меня уже есть, в базе данных сервера SQL, но мне не нужны данные, содержащиеся в исходной таблице. Примеры, которые я нашел, включают только копирование данных.

Вот подробности:

  1. Копировать только структуру таблицы, а не данные.
  2. Исходная и целевая таблицы находятся в одной базе данных.
  3. Целевая таблица еще не существует.
  4. Нужно сделать это программно
  5. Было бы неплохо также скопировать любые связанные свойства таблицы / столбцов.

Ответы [ 6 ]

7 голосов
/ 01 августа 2009

выберите * в new_table из old_table, где 1 = 0

Выполнить вышеуказанную команду программно.

3 голосов
/ 01 августа 2009

Сценарий таблицы, изменение имени таблицы в сценарии, запуск сценария.

2 голосов
/ 01 августа 2009

Бьюсь об заклад, с SMO вы можете сделать это без проблем:

  • читать структуру вашей "старой" таблицы в переменные в памяти
  • использовать эту информацию о структуре для создания новой таблицы

Я быстро нашел несколько интересных статей, которые показывают хотя бы часть решения:

Так что в основном все сводится к следующему:

Server localServer = new Server("(local)");
Database testDB = localServer.Databases["test"];

Table myTable = testDB.Tables["TestFiles"];
myTable.Refresh();

Table newTable = new Table(testDB, "MyNewTableName");

foreach(Column col in myTable.Columns)
{
    Column newColumn = new Column(newTable, col.Name);

    newColumn.DataType = col.DataType;
    newColumn.Default = col.Default;
    newColumn.Identity = col.Identity;
    newColumn.IdentityIncrement = col.IdentityIncrement;
    newColumn.IdentitySeed = col.IdentitySeed;
    newColumn.Nullable = col.Nullable;

    newTable.Columns.Add(newColumn);
}

newTable.Create();

Конечно, в «Столбце» есть и другие свойства, которые вы, возможно, захотите скопировать, плюс вы также можете скопировать индексы, ограничения и т. Д. - дополнительная работа.

Я в замешательстве, что нет более простого способа дублировать объект «Столбец» на новый (что-то вроде метода .Clone ()), чтобы облегчить это - возможно, это не сценарий с высоким приоритетом не знаю ....

Надеюсь, это поможет!

Марк

1 голос
/ 01 августа 2009

Если вы используете .NET, вы можете использовать объекты управления сервером:

var so = new ScriptingOptions();
so.Triggers = true;
so.DriForeignKeys = true;
so.DriDefaults = true;
so.DriAllConstraints = true;
so.DriAllKeys = true;
so.DriIndexes = true;
so.DriUniqueKeys = true;
so.DriPrimaryKey = true;
so.Indexes = true;
so.Default = true;
so.ClusteredIndexes = true;
so.IncludeDatabaseContext = true;
so.TargetServerVersion = SqlServerVersion.Version90;

var server = new Server("ServerName");
var db = server.Databases["DatabaseName"];
var stringColl = db.Tables["Table"].Script(so);

Вам потребуется заменить имена таблицы и связанных объектов (например, FK_OldTableName_xxx на FK_NewTableName_xxx) в сгенерированном сценарии:

var sb = new StringBuilder();
foreach(var s in stringColl)
{
    var r = s.Replace("OldTableName", "NewTableName");
    sb.AppendLine(r);
}

А затем выполнить:

db.Execute(sb.ToString());

Обратите внимание, что это довольно наивный код: он будет работать только в том случае, если имена ваших ограничений и ключей соответствуют формату: FK_OldTableName_xxx / CK_OldTableName_xxx .. если у них есть другие имена, вам нужно увеличить код замены строки, возможно, с помощью регулярных выражений для поиска шаблонов создания объектов T-SQL (например, CREATE INDEX, FOREIGN KEY и т. д.).

1 голос
/ 01 августа 2009

В SQL Management Studio щелкните правой кнопкой мыши имя таблицы и таблицу сценариев как | СОЗДАТЬ ... | Новое окно редактора запросов. Это даст вам скрипт, который вы можете запустить в любой базе данных.

0 голосов
/ 01 августа 2009

Вам нужно сделать это автоматически (без ручного вмешательства)?

В противном случае вы всегда можете использовать SQL Server Management Studio для создания сценариев CREATE для таблиц, которые вы хотите скопировать, и запуска их в целевой базе данных.

Щелкните правой кнопкой мыши по нужному объекту, выберите команду «Генерировать скрипт» и выберите свой скрипт для генерации.

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