Определите структуру 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",
},
}
Следующее настраивает ситуацию, которую я имел, с помощью табличных переменных.
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
временная таблица и затем заканчиваться с нормальной вставкой. Таким образом, я могу избежать своего цикла, но я не могу избежать временной таблицы.
В одном оператор : Нет.
В одном транзакция : Да
BEGIN TRANSACTION
DECLARE @DataID int;
INSERT INTO DataTable (Column1 ...) VALUES (....);
SELECT @DataID = scope_identity();
INSERT INTO LinkTable VALUES (@ObjectID, @DataID);
COMMIT
хорошие новости - то, что вышеупомянутый код, как также гарантируют, будет атомарный и может быть отправлен на сервер от клиентского приложения с одной строкой sql в единственном вызове функции, как будто это был один оператор. Вы могли также применить триггер к одной таблице для получения эффекта единственной вставки. Однако это - в конечном счете все еще два оператора, и Вы, вероятно, не хотите работать, триггер для каждый вставляют.
Вам все еще нужно два INSERT
операторы, но это кажется, что Вы хотите добраться IDENTITY
, сначала вставляют и используют его во втором, в этом случае, Вы могли бы хотеть изучить OUTPUT
или OUTPUT INTO
: http://msdn.microsoft.com/en-us/library/ms177564.aspx
Вы могли бы создать Представление, выбирающее имена столбцов, требуемые Вашим оператором вставки, добавить, что INSTEAD OF ВСТАВЛЯЕТ Триггер и вставляет в это представление.
Это кажется, что таблица Link получает many:many отношения между таблицей Object и Таблицей данных.
Мое предложение состоит в том, чтобы использовать хранимую процедуру для управления транзакциями. Когда Вы хотите вставить в Объект, или Таблица данных выполняют Ваши вставки, получают новые идентификаторы и вставляют их в таблицу Link.
Это позволяет всей Вашей логике оставаться инкапсулировавшей в одном легком для вызова sproc.
Если бы Вы хотите, чтобы действия были более или менее атомарными, я удостоверился бы, что перенес их в транзакцию. Тем путем можно быть уверены, что оба произошли, или обоих не произошло по мере необходимости.
Вставка может только воздействовать на одну таблицу за один раз. Несколько Вставок должны иметь несколько операторов.
я не знаю, что необходимо сделать цикличное выполнение через табличную переменную - Вы не можете только использовать массовую вставку в одну таблицу, затем массовая вставка в другой?
Между прочим - я предполагаю, что Вы имеете в виду, копируют данные из Object_Table; иначе вопрос не имеет смысла.
Перед способностью сделать, который мультитаблица вставляет в Oracle, Вы могли использовать прием, включающий вставку в представление, которому определили триггер INSTEAD OF на нем для выполнения вставок. Это может быть сделано в SQL Server?