Экспортируйте таблицы в SSMS и импортируйте их на другой сервер - PullRequest
0 голосов
/ 17 января 2020

У нас есть клиенты, которые запускают определенное программное обеспечение с большой SQL серверной базой данных и используют SSMS для управления им (мы не хотим просить их устанавливать любое другое программное обеспечение на их серверах). Нам нужно получить несколько таблиц с сервера, используя SSMS, чтобы они могли их сохранить (это должен быть относительно простой процесс, это будет ИТ-менеджер, а не администратор базы данных или программист, выполняющий задачу) и отправить их нам ( на USB-накопителе).

Итак, я экспериментировал с опцией генерирования скрипта, но в тесте, который я сделал, мы получили файл 200 ГБ .sql, который затем мне нужно было бы отредактировать в первой строке (USE [database]), чтобы указать другую базу данных для копирования (или каждый клиент будет иметь одно и то же имя базы данных и перезаписывать данные от других клиентов). Конечно, редактирование строки в файле объемом 200 ГБ - непростая задача, но мне все равно придется заставить импорт работать.

Я подумал, может быть, если я использую сценарий генерирования из образца базы данных для создания таблиц et c с моей стороны, затем используйте функцию экспорта в SSMS для экспорта данных в CSV, однако данные, скорее всего, будут совсем не чистыми, и это может легко вызвать проблемы с CSV. Я думал о плоском файле, а не о CSV, но я боюсь, что они могут что-то перепутать с кодировкой et c (и я не уверен, насколько беспорядочными данные идут в плоском файле по сравнению с CSV).

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

Есть идеи? Мы находимся на Windows Server 2012 R2, и данные могут поступать из различных версий SQL Server, в зависимости от того, как недавно эта компания обновила.

1 Ответ

0 голосов
/ 21 января 2020

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

Мы создали набор инструкций и скрипт, который заставит клиента создать новую базу данных, затем использовать скрипт передать данные в новую базу данных, а затем создать резервную копию этой вновь созданной базы данных.

Сценарий (запрос) эффективно создает из таблиц все значения oop до go и создает sql с :

SET @sql = 'SELECT * INTO [' + @toDB + '].' + @currTable + ' FROM [' + @fromDB + '].' + @currTable

, которая берет текущее имя таблицы (@currTable) и перемещает его из своей основной базы данных (@fromDB) во вновь созданную базу данных (@toDB).

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

Для справки, если другим нужно сделать что-то подобное, вот скрипт:

--before you run this script, check that the 2 variables at the top are set correctly
--the @toDB variable should be a database you have just created to temporarily store exported data
DECLARE @fromDB VARCHAR(max) = 'main_database' --this should be set to the name of the database you are copying from
DECLARE @toDB VARCHAR(max) = 'main_database_export' --this should be set to the name of the database you are copying to (the temporary one)

/* ------------------------------------------
---------Do not edit from here down---------
------------------------------------------- */
--declare variables to be used in different parts of the script
DECLARE @sql VARCHAR(max)
DECLARE @currPos INT = 1
DECLARE @currTable VARCHAR(max)
DECLARE @tableNames TABLE(id INT, name varchar(max))
--create a list of files that we want top copy to the new database, the id must be sequential and start at 1)
INSERT INTO @tableNames VALUES
    (1, '[dbo].[table1]'),
    (2, '[dbo].[table2]'),
    (3, '[dbo].[table3]'),
    (4, '[dbo].[table4]')

DECLARE @totalTables INT = 4 --this should always be the number of the last table to be copied, if you add more or take any away, update this

--loop through the tables and copy them across
WHILE (@currPos <= @totalTables)
BEGIN

  --get the table name of the table we are up to
    SELECT @currTable = name FROM @tableNames WHERE id = @currPos

  --create the sql that will copy from the old table into the new table (including the table structure), this table must not exist yet
    SET @sql = 'SELECT * INTO [' + @toDB + '].' + @currTable + ' FROM [' + @fromDB + '].' + @currTable

  --run the sql statement we just created, this will create the table and copy the content (and leave a message to say how many rows were copied)
    EXECUTE (@sql)

  --set the counter up one so we move onto the next table
    SET @currPos = @currPos+1

  --output the name of the table that was just processed (note that no messages will show until the entire script finishes)
    PRINT @currTable + ' Copied.'

END

Обратите внимание, что этот скрипт предназначен для предоставления клиенту, для них инструкция "Не редактировать отсюда" (вам нужно будет редактировать имена таблиц, которые вы копируете, и переменную, содержащую общее количество таблиц) .

Затем мы отправляем это с набором инструкций о том, как создать новую базу данных, запускаем этот сценарий и затем создаем резервную копию новой базы данных et c.

...