这是一个带有特定示例的通用问题。

我有一个包含三个字段的表(genreID(PK IDENTITY),类型和subGenre)。该表对(类型,subGenre)组合具有唯一约束。

我想知道如何修改存储过程以在表中不存在时插入,否则返回现有流派的genreID(如果存在)。

CREATE PROCEDURE spInsertGenre
    @genreID int OUTPUT,
    @genre varchar(100),
    @subGenre varchar(100)= NULL
AS
BEGIN
    INSERT INTO Genre
    (
        genre,
        subGenre
    )
    Values (
        @genre,
        @subGenre
    )

    SELECT @genreID = SCOPE_IDENTITY()
END
GO

最佳答案

在执行插入操作之前,您可以尝试选择SP将插入的行:

CREATE PROCEDURE spInsertGenre
    @genreID int OUTPUT,
    @genre varchar(100),
    @subGenre varchar(100)= NULL
AS
BEGIN
    -- if the row to be inserted already exists, put the genreID into the @genreID output parameter
    SELECT @genreID = genreID
    FROM Genre
    WHERE genre = @genre
    AND subGenre = @subGenre

    IF @genreID IS NULL -- if the genreID was not found, do an insert and select the new genreID to the @genreID output parameter
    BEGIN
        INSERT INTO Genre
        (
            genre,
            subGenre
        )
        Values (
            @genre,
            @subGenre
        )

        SELECT @genreID = SCOPE_IDENTITY()
    END
END
GO

关于sql - 使用存储过程具有唯一约束的SQL插入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18649412/

10-10 11:46