перезаписать таблицу данными из другой таблицы - SQL


9

Наши пользователи хотят обновить базу данных QA с производства, но хотят, чтобы две таблицы (назовем их T1 и T2) сохранили исходные данные QA. Поэтому я скопировал две таблицы из QA (DB1) в базу данных временного QA (DB2). Затем обновили DB1 с производства. После обновления я хочу перезаписать данные T1 и T2 из DB2 в DB1, чтобы они могли содержать значения QA перед обновлением.

Я сделал следующее:

  1. использование

    select * 
    INTO D1.dbo.T1
    FROM D2.dbo.T1
    
  2. Потом обновил D1 от прод

  3. Затем обрежьте T1 следующим шагом:

    SELECT COUNT(*) AS BeforeTruncateCount
    FROM T1;
    GO
    TRUNCATE TABLE T1;
    GO
    SELECT COUNT(*) AS AfterTruncateCount
    FROM T1;
    GO
    
  4. Теперь, когда я возвращаюсь к копированию данных из D2.T1 в D1.T1, я получаю сообщение об ошибке, что в базе данных уже есть объект с именем T1.

Должен ли я бросить таблицу и скопировать?

Или есть ли лучший метод для всей процедуры?

Ответы:


6

Чтобы объединить ответы от @Kin и @DavidSpillett.

Сначала предположение. DB1 и DB2 находятся в одном экземпляре. Это, конечно, звучит так, как будто они есть, но никогда не повредит утверждать очевидное (особенно потому, что я ошибался в том, что раньше считал очевидным)

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

Что приводит нас к другому варианту. Однако, если данные находятся в диапазоне нескольких сотен тысяч или меньше, используйте такой код.

USE D1;
GO
TRUNCATE TABLE dbo.T1;
GO
INSERT INTO D1.dbo.T1
SELECT * 
FROM D2.dbo.T1;
GO

И последнее по порядку, но не по значению: если это где-то на границе, я бы попробовал оба и посмотрел, что лучше для вас.

ПРИМЕЧАНИЕ. Возможно, вы также решите не использовать SELECT *в INSERT INTOи вместо этого указать список полей.

Эта структура будет выглядеть так

INSERT INTO D1.dbo.T1 (Field1, Field2)
SELECT Field1, Field2
FROM D2.dbo.T1;

Спасибо за информацию. Да, в таблице всего 7800 строк, поэтому она довольно маленькая и на том же экземпляре. Я попытался использовать INSERT INTO (без выбора), и он работал отлично. Спасибо, что поделились этим. Также я проверил с Импорт данных с SSMS. Это тоже отлично сработало.
Ризван

1
Помните, что вам нужно будет указать список полей (а не использовать *), если в таблице есть поле идентификатора - эти значения нельзя просто «скопировать».
Конрад

6

IIRC с SELECT <stuff> INTO <target> FROM ...синтаксисом SQL Server всегда предполагает, что вы хотите создать таблицу назначения с нуля. Если таблица уже существует, попробуйте INSERT <target> SELECT <stuff> FROM ...вместо этого.


5
Кроме того, ответ Дэвида также является лучшим маршрутом, чем DROP и SELECT INTO при перемещении данных обратно в D1, потому что если вы отбросите таблицы D1, вы потеряете любые дочерние объекты (то есть внешние ключи, первичные ключи, триггеры и т. Д.). )
Delux

2
Я согласен с @Delux. Еще одна важная вещь, которую вы потеряете, это явные разрешения. Если у пользователя есть разрешения, специфичные для этой таблицы (а не, скажем db_datareader), то если вы отбросите таблицу, то вы потеряете эти разрешения.
Кеннет Фишер

Это отличный совет. Я не понимал последствия DROP до сих пор. Спасибо!
Ризван

6

Лучше всего использовать SSIS (импорт / экспорт данных) для этого. Он имеет функцию просто переносить выбранные таблицы из источника в место назначения. При желании вы можете даже сохранить пакет, чтобы его можно было использовать для будущих / повторных передач.

РЕДАКТИРОВАТЬ: Добавление большего количества скриншотов для ясности.

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь


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

Отличное решение, хорошие скриншоты работают!
Майер Спитцер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.