Вывести текущий идентификатор вставленной записи, используя OUTPUT в триггере - PullRequest
0 голосов
/ 13 июля 2011

Мне нужно сделать следующее: на вставленной записи мне нужно сохранить идентификатор вставленного элемента и идентификатор выбранного элемента.(Пример ниже) Я использую после триггера вставки (в основном я копирую одну строку из одной таблицы в другую и делаю еще несколько модификаций. У меня есть такой параметр таблицы:

DECLARE @Tempequipment TABLE
(Equipment_Id int,
DefaultEquipment_Id INT)

Затем я вставляю в таблицукак это:

INSERT INTO dbo.tblEquipmentType
        ( Name, EquipmentType_Id)  
SELECT name,(SELECT Equiment_Id FROM INSERTED)
FROM dbo.tblDefaultEquipmentType

Это прекрасно работает!

Что мне нужно сделать, это: мне нужно вставить в @TempEquipment EquipmentTypeId, которые были только что вставлены (может быть больше одного) иDefaultEquipmentTypeId, которые были только что скопированы.

Я думал о том, чтобы сделать что-то вроде:

INSERT INTO dbo.tblEquipmentType
            ( Name, EquipmentType_Id)  
Output EquipmentTypeId, DefaultEquipmentTypeId into @TempEquipment
    SELECT name,(SELECT Equipment_Id FROM INSERTED)
    FROM dbo.tblDefaultEquipmentType

, но, конечно, это не сработает, так как он не может получить значения из оператора выбора, а ненаписано правильно. Любая помощь приветствуется!

ОБНОВЛЕНИЕ:
У меня есть предмет. Предмет может быть построен на различном оборудовании. Оборудование имеет типы (внешний ключ. И equipmentType имеет атрибуты (foreignkey).

Таким образом, это означает, что у нас есть четыре таблицы Item-> Equipment-> EquipmentType-> EquipmentAttribute. Мне нужно хранить стандартные EquipmentTypes и стандартные EquipmentAtатрибуты для этого типа.

Таким образом, я также получил эти отношения: Equipment-> DefaultEquipmentType-> DefaultEquipmentAttribute.

Теперь, когда я вставляю новый элемент и выбираю оборудование, я хочу скопировать значения по умолчанию в реальные таблицы (EquipmentType, EquipmentAttribute).Это хоть немного понятно?

Ответы [ 2 ]

0 голосов
/ 20 июля 2011

Для оператора INSERT вы можете получить доступ только к столбцам, которые находятся в списке вставляемых столбцов, поэтому решение состоит в том, чтобы переписать оператор в виде оператора MERGE, который может получить доступ ко всем столбцам, включая столбцы, которые находятся, например, в целевой таблице INSERT. Столбцы IDENTITY.

В демоверсии я использовал dbo.INSERTED для эмуляции виртуальной таблицы, вставленной из триггера.

USE master
GO
IF DB_ID('MergeOutputExample') IS NOT NULL
    DROP DATABASE MergeOutputExample
GO
CREATE DATABASE MergeOutputExample
GO
USE MergeOutputExample
GO
DECLARE @Tempequipment TABLE
(EquipmentId int,
DefaultEquipmentId INT,
ID int);

CREATE TABLE    dbo.INSERTED
(
    EquipmentTypeId         int PRIMARY KEY
);

CREATE TABLE    dbo.tblEquipmentType
(
    ID                      int         IDENTITY(1,1),
    Name                    varchar(50),
    EquipmentTypeId         int         PRIMARY KEY
);

CREATE TABLE    dbo.tblDefaultEquipmentType
(
    EquipmentTypeId         int,
    DefaultEquipmentTypeId  int         IDENTITY(1,1) PRIMARY KEY,
    Name                    varchar(50)
);

INSERT  dbo.inserted
        (
            EquipmentTypeId
        )
VALUES  (1);

INSERT  dbo.tblDefaultEquipmentType
        (
            EquipmentTypeId,
            Name
        )
VALUES  (
            1,
            'Hammer'
        );

MERGE   dbo.tblEquipmentType    AS ET
USING   (
            SELECT      DE.EquipmentTypeId,
                        DE.DefaultEquipmentTypeId,
                        DE.Name
            FROM        dbo.tblDefaultEquipmentType     DE
            INNER JOIN  dbo.INSERTED                    I
            ON          DE.EquipmentTypeId              = I.EquipmentTypeId 
        )                       AS DET
ON      ET.EquipmentTypeId          = DET.EquipmentTypeId
WHEN    NOT MATCHED BY TARGET
THEN    INSERT
        (
            Name,
            EquipmentTypeID
        )
        VALUES
        (
            DET.Name,
            DET.EquipmentTypeID
        )
OUTPUT  DET.EquipmentTypeId,
        DET.DefaultEquipmentTypeId,
        INSERTED.ID
INTO    @Tempequipment;

SELECT      *
FROM        @Tempequipment;

SELECT      *
FROM        dbo.tblEquipmentType;
0 голосов
/ 16 июля 2011

Помимо как вы пытаетесь это сделать (что не работает), что конкретно вы пытаетесь сделать?

Это может бытьчто это может быть решено путем изменения / нормализации вашей парадигмы вместо какого-то экзотического кода.Например, выглядит странным иметь таблицу клиентов с полем orderID.Если только ваши клиенты не заказывают только одну вещь ... Я бы ожидал увидеть таблицу клиентов, таблицу товаров, а затем таблицу заказов, которая объединяла бы клиентов с товарами.

Надеюсь, что это имеет смысл - но в любом случаеЕсли нет, то можете ли вы опубликовать структуру таблицы, и, может быть, будете немного яснее о том, что вы знаете заранее (например, я предполагаю, что вы знаете, кто ваши клиенты и что они заказали ... до того, как вы сделаете вставку...yes?)

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