SQL Server存储过程检查插入前是否存在记录

Kai*_*ran 0 sql sql-server stored-procedures

我正在检查记录是否存在,然后将其插入到表中(并且此方法似乎适用于我已在使用的其他存储过程)但是对于此特定存储过程,即使表为空,也不会插入任何内容, 为什么不?

CREATE PROCEDURE spInsertMovieHasTrailer
    @movieID int,
    @name varchar(50)
AS
BEGIN
    SELECT @name = name, @movieID = movieID
    FROM MovieHasTrailer
    WHERE name = @name and movieID = @movieID

    IF @name IS NULL and @movieID IS NULL
    BEGIN
    INSERT INTO MovieHasTrailer
    (
        movieID,
        name
    )
    Values (
        @movieID,
        @name
    )
    END
END
Run Code Online (Sandbox Code Playgroud)

执行如下:

execute spInsertMovieHasTrailer 1, 'Test'
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 7

我会将它直接构建到insert而不是使用if逻辑. if介绍竞争条件:

INSERT INTO MovieHasTrailer
    SELECT movieID, name
    FROM (SELECT @movieID as movieID, @name as name) t
    WHERE NOT EXISTS (SELECT 1
                      FROM MovieHasTrailer mht
                      WHERE mht.MovieId = t.MovieID AND mht.name = t.name
                     );
Run Code Online (Sandbox Code Playgroud)

请注意,这假设您需要id和名称来匹配电影.我认为id这就足够了.

另外,我真正要做的是在MovieHasTrailer(MovieId)或两者上都有一个独特的索引MovieHasTrailer(MovieId, Name).如果存在插入错误,请使用try/ catchblock.