SQL 2005 저장 프로 시저 값을 반환하거나 존재하지 않는 경우 만들려면


1

저장 프로 시저 (SQL 2005)에 문제가 있습니다.

나는 TagIDTagName의 두 열이있는 tbrm_Tags이라는 테이블이 있습니다. 내가 저장 프로 시저에 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 

나는 Tagname가 존재하는 경우 TagID를 반환하는 SELECT 문을 얻을 수 없습니다.

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 feb. 092009-02-22 20:12:27