Основной вопрос T-SQL - PullRequest
       23

Основной вопрос T-SQL

3 голосов
/ 13 февраля 2011

Допустим, у меня есть три таблицы, реализованные с отношением «многие ко многим».Что-то вроде Person (personID), PersonMovies (personID, movieID) и Movies (movieID).Как правильно сделать несколько вставок на сервере SQL?Я хотел бы вставить человека, фильмы и затем быть в состоянии получить все фильмы, которыми владеет человек.Так будет ли три вставки в транзакции?Если это так, я бы предположил, что самая простая часть - это вставка в таблицу person и movie, но как бы я вставил ее в таблицу PersonMovies, поскольку эта таблица опирается на существующие идентификаторы в двух других таблицах.Я предполагаю, что я вставил бы в Person и Movies, затем каким-то образом установил присвоение идентификаторов вновь вставленных таблиц переменной из этих двух таблиц, а затем использовал эти переменные для вставки в таблицу моста.Я понятия не имею, но я надеюсь, что это имеет какой-то смысл, поскольку я ОЧЕНЬ смущен этим !!

Ответы [ 2 ]

0 голосов
/ 13 февраля 2011

Начните с вставки записи Person и используйте SCOPE_IDENTITY , чтобы получить уникальный идентификатор, если вставлена ​​запись. Затем вы можете использовать это, чтобы вставить фильмы человека. Прежде чем вы сможете вставить фильм о людях, вам нужно посмотреть, существует ли он или нет, если он существует. Если он выберет его из существующей таблицы и присвоит его уникальный идентификатор переменной. Если он еще не существует, используйте ту же технику для добавления человека и вставки фильма, а затем назначьте SCOPE_IDENTITY для переменной фильма.

В PL / SQL есть оператор UPSERT, который комбинирует обновление записей или вставку их при необходимости. Я добавил код ниже для процедуры, которая выполняет UPSERT в T / SQL и возвращает уникальный идентификатор, если должна была быть создана запись.

IF EXISTS (SELECT id FROM dbo.sysobjects WHERE name = 'fts_upsert_team') DROP PROCEDURE fts_upsert_team
GO

CREATE PROCEDURE fts_upsert_team
    @teamID INT OUTPUT,
    @name VARCHAR(100)

AS

    UPDATE 
        fts_teams
    SET
        name = @name
    WHERE
        teamID = @teamID

    IF @@ROWCOUNT = 0
    BEGIN

        INSERT INTO fts_teams
        (
            name
        )
        VALUES
        (
            @name
        )

        SET @teamID = SCOPE_IDENTITY()

    END


GO
0 голосов
/ 13 февраля 2011

Я предполагаю, что у вас есть автоматическое увеличение Персона и Фильмы.Если это так, вам нужно определить, какое ключевое поле находится после вставки.Вы можете использовать функцию scope_identity (), чтобы получить значение this.После каждой вставки сохраняйте их в переменную, а затем при входе в PersonMovies используйте сохраненные значения.

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