2014-02-05 3 views
0

Я начал со столом, который выглядел примерно так:Вставка и обновление

Собака (ID, пол, имя)

Было принято решение о создании нового владельца таблицы.

Владелец (ID, Имя)

где владелец-идентификатор типа GUID данных.

и обновлять таблицу Собака на:

Собака (ID, пол, имя, OwnerId)

в качестве базы данных в настоящее время используется несколькими программами и не все программы могут быть обновлены в то же время было принято решение не применять это новое отношение, и поэтому значения null были разрешены для OwnerID, но любое значение в идентификаторе владельца собаки должно соответствовать значению в таблице Owner.

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

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

Что было бы самым эффективным способом достижения этого? Эффективно Я ищу

INSERT INTO [dbo].[Owner] 
     ([ID],[Name]) 
VALUES 
     (newid(), 'n/a') 

Для каждой собаки, где OwnerId собаки равна нулю.

Затем Обновление

UPDATE [dbo].[Dog] 
    SET [Owner_ID] = NewIDFromAbove 

Есть ли один оператор или подобный аккуратный способ сделать это? Слияние было бы полезно здесь?

ответ

0

Вы можете использовать пункт вывода, чтобы решить эту проблему, например

declare @newIds table(id nvarchar(255)); 
INSERT INTO [dbo].[Owner] 
     ([ID],[Name]) 
     output inserted.id into @newIds 
VALUES 
     (newid(), 'n/a') 
+0

как это может помочь с обновлениями? – Jayvee

+0

Невозможно с помощью одного оператора, но мы можем использовать таблицу @newIds в следующем выражении, например, в Update Dog ... –

Смежные вопросы