SQL Server: действительно ли возможно вставить в две таблицы одновременно?

Определите структуру Proxy отдельно, вне Configuration, например:

type Proxy struct {
    Address string
    Port    string
}

type Configuration struct {
    Val string
    P   Proxy
}

c := &Configuration{
    Val: "test",
    P: Proxy{
        Address: "addr",
        Port:    "80",
    },
}

См. http://play.golang.org/p/7PELCVsQIc

134
задан 4 revs 23 October 2008 в 09:38
поделиться

8 ответов

Следующее настраивает ситуацию, которую я имел, с помощью табличных переменных.

DECLARE @Object_Table TABLE
(
    Id INT NOT NULL PRIMARY KEY
)

DECLARE @Link_Table TABLE
(
    ObjectId INT NOT NULL,
    DataId INT NOT NULL
)

DECLARE @Data_Table TABLE
(
    Id INT NOT NULL Identity(1,1),
    Data VARCHAR(50) NOT NULL
)

-- create two objects '1' and '2'
INSERT INTO @Object_Table (Id) VALUES (1)
INSERT INTO @Object_Table (Id) VALUES (2)

-- create some data
INSERT INTO @Data_Table (Data) VALUES ('Data One')
INSERT INTO @Data_Table (Data) VALUES ('Data Two')

-- link all data to first object
INSERT INTO @Link_Table (ObjectId, DataId)
SELECT Objects.Id, Data.Id
FROM @Object_Table AS Objects, @Data_Table AS Data
WHERE Objects.Id = 1

Благодаря другому ответ , который указал на меня к ВЫХОДНОМУ пункту, я могу продемонстрировать решение:

-- now I want to copy the data from from object 1 to object 2 without looping
INSERT INTO @Data_Table (Data)
OUTPUT 2, INSERTED.Id INTO @Link_Table (ObjectId, DataId)
SELECT Data.Data
FROM @Data_Table AS Data INNER JOIN @Link_Table AS Link ON Data.Id = Link.DataId
                INNER JOIN @Object_Table AS Objects ON Link.ObjectId = Objects.Id 
WHERE Objects.Id = 1

оказывается однако, что не то, чтобы простой в реальной жизни из-за следующей ошибки

ВЫВОД В пункт не может быть по обе стороны от (первичный ключ, внешний ключ) отношения

, я могу все еще OUTPUT INTO временная таблица и затем заканчиваться с нормальной вставкой. Таким образом, я могу избежать своего цикла, но я не могу избежать временной таблицы.

18
ответ дан 23 November 2019 в 23:55
поделиться

В одном оператор : Нет.

В одном транзакция : Да

BEGIN TRANSACTION
   DECLARE @DataID int;
   INSERT INTO DataTable (Column1 ...) VALUES (....);
   SELECT @DataID = scope_identity();
   INSERT INTO LinkTable VALUES (@ObjectID, @DataID);
COMMIT

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

209
ответ дан 23 November 2019 в 23:55
поделиться

Вам все еще нужно два INSERT операторы, но это кажется, что Вы хотите добраться IDENTITY, сначала вставляют и используют его во втором, в этом случае, Вы могли бы хотеть изучить OUTPUT или OUTPUT INTO: http://msdn.microsoft.com/en-us/library/ms177564.aspx

32
ответ дан 23 November 2019 в 23:55
поделиться

Вы могли бы создать Представление, выбирающее имена столбцов, требуемые Вашим оператором вставки, добавить, что INSTEAD OF ВСТАВЛЯЕТ Триггер и вставляет в это представление.

4
ответ дан 23 November 2019 в 23:55
поделиться

Это кажется, что таблица Link получает many:many отношения между таблицей Object и Таблицей данных.

Мое предложение состоит в том, чтобы использовать хранимую процедуру для управления транзакциями. Когда Вы хотите вставить в Объект, или Таблица данных выполняют Ваши вставки, получают новые идентификаторы и вставляют их в таблицу Link.

Это позволяет всей Вашей логике оставаться инкапсулировавшей в одном легком для вызова sproc.

6
ответ дан 23 November 2019 в 23:55
поделиться

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

4
ответ дан 23 November 2019 в 23:55
поделиться

Вставка может только воздействовать на одну таблицу за один раз. Несколько Вставок должны иметь несколько операторов.

я не знаю, что необходимо сделать цикличное выполнение через табличную переменную - Вы не можете только использовать массовую вставку в одну таблицу, затем массовая вставка в другой?

Между прочим - я предполагаю, что Вы имеете в виду, копируют данные из Object_Table; иначе вопрос не имеет смысла.

2
ответ дан 23 November 2019 в 23:55
поделиться

Перед способностью сделать, который мультитаблица вставляет в Oracle, Вы могли использовать прием, включающий вставку в представление, которому определили триггер INSTEAD OF на нем для выполнения вставок. Это может быть сделано в SQL Server?

2
ответ дан 23 November 2019 в 23:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: