Как продублировать таблицу SQL Server 2000 программно, используя .NET 2.0? - PullRequest
2 голосов
/ 12 февраля 2009

Я хочу сделать резервную копию таблицы, сохранив копию в той же базе данных под другим именем. Я хочу сделать это программно, используя .NET 2.0 (желательно C #). Кто-то может указать мне, что мне делать?

Ответы [ 5 ]

5 голосов
/ 12 февраля 2009

Просто отправьте этот запрос на сервер:

SELECT * INTO [BackupTable] FROM [OriginalTable]

Это создаст резервную копию таблицы с нуля (будет выдана ошибка, если она уже существует). Для больших столов будьте готовы, чтобы это заняло некоторое время. Это должно имитировать типы данных, параметры сортировки и NULLness (NULL или NOT NULL), но не будет копировать индексы, ключи или подобные ограничения.

Если вам нужна помощь в отправке SQL-запросов к базе данных, это другая проблема.

4 голосов
/ 12 февраля 2009

Один из способов сделать это - просто выполнить обычный запрос, используя INTO в SQL:

SELECT * 
INTO NewTableName 
FROM ExistingTableName 

Это автоматически создает новую таблицу и вставляет строки старой.

Другой способ - использовать SqlBulkCopy из пространства имен System.Data.SqlClient. Есть хорошая статья CodeProject, объясняющая, как это сделать:

Массовое копирование SQL с C # .Net

Программистам обычно нужно переводить производственные данные для тестирования или анализирующая. Самый простой способ скопировать много данных из любых ресурсов в SQL Сервер является BulkCopying. .NET Framework 2.0 содержит класс в пространстве имен ADO.NET "System.Data.SqlClient": SqlBulkCopy. Операция массового копирования обычно имеет две отдельные фазы.

На первом этапе вы получаете источник данные. Источником могут быть различные данные платформы, такие как Access, Excel, SQL. Вы должны получить исходные данные в своем код, оборачивающий его в DataTable, или любой класс DataReader, который реализует IDataReader. После этого во втором фаза, вы должны подключить целевой SQL База данных и выполнить массовое копирование работа.

Операция массового копирования в .Net является очень быстрый способ скопировать большое количество данные где-то в SQL Server. Причиной этого является Bulkcopy Sql Серверный механизм. Вставка всех данных строка за строкой, один за другим является очень время и системные ресурсы потребляя. Но механизм массового копирования обрабатывать все данные одновременно. Итак, данные вставка становится очень быстрой.

Код довольно прост:

// Establishing connection

SqlConnectionStringBuilder cb = new SqlConnectionStringBuilder(); 
cb.DataSource = "SQLProduction"; 
cb.InitialCatalog = "Sales"; 
cb.IntegratedSecurity = true;
SqlConnection cnn = new SqlConnection(cb.ConnectionString);  

// Getting source data

SqlCommand cmd = new SqlCommand("SELECT * FROM PendingOrders",cnn); 
cnn.Open(); 
SqlDataReader rdr = cmd.ExecuteReader(); 

// Initializing an SqlBulkCopy object

SqlBulkCopy sbc = new SqlBulkCopy("server=.;database=ProductionTest;" +
                                  "Integrated Security=SSPI"); 

// Copying data to destination
sbc.DestinationTableName = "Temp"; 
sbc.WriteToServer(rdr); 

// Closing connection and the others

sbc.Close(); 
rdr.Close(); 
cnn.Close(); 
1 голос
/ 12 февраля 2009

Вы можете использовать Объекты управления SQL Server ( SMO ). Вы можете сделать копию базы данных (данных и схемы). Есть много вариантов, которые вы можете установить. В следующем примере копируется вся база данных:

// Connect to the server
Server server = new Server(".");

// Get the database to copy
Database db = server.Databases["MyDatabase"];

// Set options
Transfer transfer = new Transfer(db);
transfer.CopyAllObjects = true;
transfer.DropDestinationObjectsFirst = true;
transfer.CopySchema = true;
transfer.CopyData = true;
transfer.DestinationServer = ".";
transfer.DestinationDatabase = "MyBackupDatabase";
transfer.Options.IncludeIfNotExists = true;


// Transfer Schema and Data
transfer.TransferData();

Документацию о классе передачи можно найти на MSDN .

0 голосов
/ 12 февраля 2009

В зависимости от количества записей в таблице это может быть очень плохой идеей из C # и пользовательского интерфейса.

Для небольшого стола используйте следующий SQL Создать таблицу table2 (field1 int, field2 varchar (10)) - конечно же, использовать фактические имена полей и типы данных)

вставить в таблицу2 (поле1, поле2) выберите field1, field2 из таблицы1

Я предлагаю создать таблицу один раз, а затем вставить, чтобы вы могли добавлять записи в таблицу несколько раз. Выбор только будет работать один раз.

0 голосов
/ 12 февраля 2009

По крайней мере, вы можете сделать «SELECT * INTO NEWTable ИЗ OldTable».

Хотите ли вы создать все индексы / ограничения и т. Д.?

РЕДАКТИРОВАТЬ: добавив к комментариям splattne, вам нужно будет получить дескриптор экземпляра таблицы, которую вы хотите скопировать. Используйте метод Script, чтобы получить скрипт, который он сгенерирует. Измените строку сценария, чтобы заменить старые имена новыми именами, и запустите ее в БД.

РЕДАКТИРОВАТЬ2: http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.table.table.aspx

http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.tableviewtabletypebase.script.aspx

...