使用存储过程的具有唯一约束的SQL插入
这是一个带有特定示例的一般性问题 我有一个包含三个字段的表(genreID(PK-IDENTITY)、genre和subGenre)。该表对(流派、子流派)组合具有唯一的约束 我想知道如果存储过程不存在于表中,如何修改它以插入,如果存在则返回现有类型的genreID使用存储过程的具有唯一约束的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
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条记录,并且没有试图插入的重复记录)