본문 바로가기

프로그래밍/MSSQL

[MSSQL] @@ROWCOUNT 영향 받은 행 수 반환

반응형

 

 

 

실행된 쿼리문의 영향을 받은 행의 수를 반환하는 @@ROWCOUNT에 대해 알아보자

 

 

 

@@ROWCOUNT

쿼리 실행문 실행 후 영향을 받은 로우의 수를 반환한다.

 

 

 

예제

 

CREATE TABLE #TEMP1 ( 제품 VARCHAR(10), 가격 INT )
 
INSERT INTO #TEMP1 (제품, 가격) VALUES ('티셔츠', 1000)
INSERT INTO #TEMP1 (제품, 가격) VALUES ('티셔츠', 2000)
INSERT INTO #TEMP1 (제품, 가격) VALUES ('바지', 5000)
INSERT INTO #TEMP1 (제품, 가격) VALUES ('신발', 10000)
 
SELECT * FROM #TEMP1

 

원본 데이터

 

UPDATE #TEMP1 SET 가격 = 3000 WHERE 제품 = '티셔츠'
SELECT @@ROWCOUNT -- 결과 : 2

 

UPDATE문에서 WHERE 제품 = '티셔츠' 조건에 맞는 행 수는 2개다.

 

2개 행의 가격이 3000으로 변경될 것이고, 영향 받은 2개의 행 수는 @@ROWCOUNT에 해당한다.

 

 

 

 

 

예제2

 

@@ROWCOUNT를 이용해서 쿼리의 성능을 향상시켜보자

 

유저이름과 유저의 방문수를 기록하는 테이블A가 있다.

 

새로운 유저가 방문했을때는 데이터를 새롭게 입력 (INSERT) 시키고,

 

만일 유저가 기존 유저일 경우 (이미 데이터 존재) 해당 유저의 방문 카운트만 +1 해주는 (UPDATE) 쿼리를 작성해보자

 

일반적으로 다음과 같이 조건문 (IF EXISTS)을 이용해서 이미 데이터 존재하는 여부를 판단 후

 

UPDATE 혹은 INSERT 문을 분기로 나눠서 실행 시킬 수 있다.

 

 

DECLARE @UserName VARCHAR(10) = '꽁쥐'
 
IF EXISTS (SELECT 유저명 FROM A WHERE 유저명 = @UserName)
    BEGIN
        UPDATE 테이블명 SET 방문수 = 방문수+1 WHERE 유저명 = @UserName
    END
ELSE
    BEGIN
        INSERT INTO 테이블명 (유저명, 방문수) VALUES (@UserName, 1)
    END

 

 

하지만, 이런 쿼리는 매번 SELECT문을 실행해서 유저의 데이터 여부를 판단해야 하기 때문에 비효율적이다.

 

그렇다면 @@ROWCOUNT를 이용해서 조금 더 효율적인 쿼리를 작성해보자

 

자 이런 쿼리는 어떤가?

 

 

DECLARE @UserName VARCHAR(10) = '꽁쥐'
 
UPDATE 테이블명 SET 방문수 = 방문수+1 WHERE 유저명 = @UserName
 
IF @@ROWCOUNT = 0
    BEGIN
        INSERT INTO 테이블명 (유저명, 방문수) VALUES (@UserName, 1)
    END

 

 

일단 UPDATE문으로 해당 유저의 방문수를 +1 시킨다.

 

만약 기존 유저가 아니기 때문에 조건에 일치하는 데이터가 없을 경우

 

즉, 영향 받은 행 0인 경우 (@@ROWCOUNT가 0인 경우) 에만 데이터를 INSERT 시켜준다.

 

 

 

 

자, 첫 번째로 작성한 쿼리는 무조건 두 번의 쿼리문이 수행된다.

 

1. 해당 유저의 존재여부 판단 (SELECT)

 

2. 해당 유저 데이터 입력 또는 방문수 수정 (INSERT, UPDATE)

 

 

 

 

그러나 두 번째로 작성한 쿼리는 한 번의 쿼리문의 수행으로 끝날수도 있다.

 

1. 해당 유저의 방문수 수정

 

2. 해당 유저의 데이터가 없을 경우에만 INSERT

 

 

 

 해당 유저의 데이터가 존재할 경우 2번은 생략되기 때문에, 한번의 쿼리문으로 끝나게 되는것이다.

 

물론 해당 유저의 데이터가 존재하지 않을 경우에는 동일하게 두 번의 쿼리가 수행된다.

 

 

 

 

반응형