Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用存储过程的具有唯一约束的SQL插入_Sql_Stored Procedures_Insert_Sql Server 2008 R2_Unique Constraint - Fatal编程技术网

使用存储过程的具有唯一约束的SQL插入

使用存储过程的具有唯一约束的SQL插入,sql,stored-procedures,insert,sql-server-2008-r2,unique-constraint,Sql,Stored Procedures,Insert,Sql Server 2008 R2,Unique Constraint,这是一个带有特定示例的一般性问题 我有一个包含三个字段的表(genreID(PK-IDENTITY)、genre和subGenre)。该表对(流派、子流派)组合具有唯一的约束 我想知道如果存储过程不存在于表中,如何修改它以插入,如果存在则返回现有类型的genreID CREATE PROCEDURE spInsertGenre @genreID int OUTPUT, @genre varchar(100), @subGenre varchar(100)= NULL AS

这是一个带有特定示例的一般性问题

我有一个包含三个字段的表(genreID(PK-IDENTITY)、genre和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

+1,但还要确保将select和insert封装在BEGIN transaction和COMMIT transaction中,将其放入单个事务中。否则,如果存储过程同时执行多次,则可能出现重复记录。。。但是我很好奇,插入5000条记录的时间是16秒,没有SELECT语句,仍然是16秒——我只是想知道为什么这里没有速度损失(允许我在一个以0条记录开始的表中插入5k条记录,并且没有试图插入的重复记录)