SQL 2005存储过程返回值或创建它,如果它不存在


1

我有一个存储过程(SQL 2005)的问题。

我有一个名为tbrm_Tags的表,有两列,分别是TagIDTagName。我想一个TagName值传递给存储过程,然后我想:

  1. 检查是否Tagname存在,如果它不返回TagID
  2. 如果Tagname不存在,我希望它插入到该表并返回TagID

这里是存储过程我使用:

@TagID int = null, 
    @TagName varchar(50) 

AS 

DECLARE @returnValue int 

    BEGIN 
    IF EXISTS (SELECT * FROM tbrm_Tags WHERE TagName = @TagName) 
    BEGIN 

    SELECT 

    TagID 

    FROM tbrm_Tags 

    WHERE TagName = @TagName 

END 
ELSE 
BEGIN 
IF NOT EXISTS (SELECT * FROM tbrm_Tags WHERE TagName = @TagName) 

    INSERT INTO tbrm_Tags 

    (
    TagName 

) 
    VALUES 
    (
    @TagName 

    ) 

    SELECT @returnValue = @@IDENTITY 

    END 
    END 

    RETURN @returnValue 

我不能让select语句返回TagIDTagname存在。

9

注意:不要使用@@IDENTITY - 它受到触发;始终使用SCOPE_IDENTITY()

我可能只是做:

DECLARE @returnValue int 

SELECT @returnValue = TagID 
FROM tbrm_Tags 
WHERE TagName = @TagName 

IF @returnValue IS NULL 
BEGIN 
    INSERT tbrm_Tags(TagName) 
    VALUES (@TagName) 

    SET @returnValue = SCOPE_IDENTITY() 
END 

RETURN @returnValue 

3
SELECT 

@returnValue = TagID 

FROM tbrm_Tags 

WHERE TagName = @TagName 

0

我怀疑马克G.的代码会工作得很好,但我会作出最后一行是这样的:

SELECT @returnValue AS RETURNVALUE 

我一直这样做,但我不确定这两种方法之间有什么功能上的区别......任何人都知道?

  0

有很大的差异。一个使用proc的返回值;另一个返回一个单元格的网格。两者不兼容。返回值有点(不是很大),并且如果直接从TSQL调用(INSERT/EXEC很混乱),则返回值更加清晰。 22 2月. 092009-02-22 20:12:27