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

Использование ping хорош, пока Вы просто хотите "ожидать некоторое время". Это, так как Вы зависите от других функций внизу, как Ваша сетевая работа и то, что нет ничего отвечающего на 127.0.0.1.;-), Возможно, не вероятно, что это перестало работать, но это не невозможно...

, Если Вы хотите быть уверенными, что Вы ожидаете точно требуемое время, необходимо использовать sleep функциональность (которые также имеют преимущество, что это не использует мощность ЦП или ожидает сети для становления готовым).

Для нахождения уже сделанного исполняемого файла для сна наиболее удобный способ. Просто бросьте его в свою папку Windows или любую другую часть Вашего стандартного пути, и это всегда доступно.

Иначе, если у Вас есть среда компиляции, можно легко сделать тот сами. Эти Sleep функция доступна в kernel32.dll, таким образом, просто необходимо использовать тот.:-) Для VB / VBA объявляют следующее в начале Вашего источника объявить функцию сна:

private Declare Sub Sleep Lib "kernel32" Alias "Sleep" (byval dwMilliseconds as Long)

Для C#:

[DllImport("kernel32.dll")]
static extern void Sleep(uint dwMilliseconds);

Вы найдете здесь больше об этой функциональности (доступный начиная с Windows 2000) в функция Сна (MSDN).

В стандарте C, sleep() включен в стандартную библиотеку, и в Visual Studio Microsoft C функция назван Sleep(), если не изменяет память, меня.;-), Те два берет аргумент в секундах, не в миллисекундах как два предыдущих объявления.

7
задан Brian Tompsett - 汤莱恩 1 October 2016 в 22:48
поделиться

6 ответов

выберите * в новую_таблицу из старой_таблицы, где 1 = 0

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

7
ответ дан 6 December 2019 в 15:25
поделиться

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

3
ответ дан 6 December 2019 в 15:25
поделиться

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

1
ответ дан 6 December 2019 в 15:25
поделиться

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

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

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

0
ответ дан 6 December 2019 в 15:25
поделиться

Держу пари, с 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 ()), чтобы облегчить это - возможно, это не самый приоритетный сценарий, я не знаю ... .

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

Марк

2
ответ дан 6 December 2019 в 15:25
поделиться

Если вы используете .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 .. если у них есть другие имена, вы ' d необходимо усилить код замены строки, вероятно, используя регулярные выражения для поиска шаблонов создания объектов T-SQL (например, CREATE INDEX, FOREIGN KEY и т. д.).

1
ответ дан 6 December 2019 в 15:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: