Как скопировать таблицу ограничений внешнего ключа в другую базу данных? - PullRequest
0 голосов
/ 17 февраля 2019

Я пытаюсь заменить бессмысленные данные на своем сервере разработки (восстанавливая их с рабочего сервера).

Сначала я попытался использовать задачу «импорта данных» SSMS, но обнаружил ошибку, говорящую: «Невозможно усечьтаблица с ограничением внешнего ключа ", поэтому я решил сделать следующее:

  1. Создать новую временную копию таблицы на сервере разработки (чтобы избежать доступа к ней из производственной базы данных).
  2. Напишите скрипт обновления.

Это мой скрипт:

DECLARE @IdToCopy INT;
DECLARE @cnt INT;

SET @IdToCopy = 1
WHILE @IdToCopy <= 55
BEGIN
    UPDATE DocumentTypes
    SET Name = DocumentTypesTemp.Name
    FROM DocumentTypesTemp
    WHERE DocumentTypesTemp.DocumentTypeId = @IdToCopy;

    SET @IdToCopy += 1;
END;

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

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Я исправил свой скрипт, используя следующее:

DECLARE @IdToCopy INT;
DECLARE @cnt INT;
DECLARE @NameToCopy varchar(256);
SET @IdToCopy=1

SELECT @cnt=COUNT(*) FROM DocumentTypesTemp;

WHILE @IdToCopy <= @cnt
BEGIN
    SELECT @NameToCopy=Name
    FROM DocumentTypesTemp 
    WHERE DocumentTypesTemp.DocumentTypeId=@IdToCopy;

    UPDATE DocumentTypes
    SET Name=@NameToCopy
    WHERE DocumentTypes.DocumentTypeId=@IdToCopy;

    SET @IdToCopy += 1;
END;
0 голосов
/ 17 февраля 2019

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

В каждой итерации whileцикл, вся ваша таблица DocumentTypes обновляется.По этой причине вы видите только последнее имя записи, появляющееся во всей таблице, вы должны объединить исходную и целевую таблицы на основе идентификатора.

UPDATE dest 
SET    dest.NAME = src.NAME 
FROM   documenttypes dest 
       INNER JOIN documenttypestemp src 
               ON src.documenttypeid = dest.documenttypeid 

Вышеупомянутый запрос обновит имя из таблицы назначения в исходную таблицу с совпадением documenttypeid в одном запросе.

Примечание: Вам не нужноцикл while для обновления имени от источника к месту назначения.

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