본문 바로가기

Computer/Database

MS-SQL Stored Procedure

강좌 전 태오의 잡담>

이 강좌는 ASP나 ASP.NET을 다루려는 개발자들이 데이터베이스와 관련하여 반드시 알고있어야 할 부분중에 하나인 Stored Procedure 에 대한 이야기입니다. 사실, 이 내용은 Taeyo's Advanced ASP(정보문화사)에 존재하는 내용입니다만 여러분이 ADO.NET을 접하기 전에 먼저 알아두어야 할 것같기에 올립니다. ASP.NET 책을 준비하다보니 이 정도의 내용은 책에 쓰기 보다 강좌로 올려서 많은 분들이 보실 수 있게 하는 게 바람직해서.. 늦었지만... 이제야 올립니다 ^^





강좌 시작 >

내장 프로시져는 복잡한 SQL 문을 단순화 시켜주고, 보안적인 문제도 해결해 주는 역할을 하며, 매우 빠른 성능을 자랑한다.이는 복잡한 쿼리들을 모아서 하나의 프로시져로 처리할 수 있으며, 그에 따른 처리결과를 돌려주는 형식을 취한다.

요즘 들어 많은 ASP 문서들에서 스토어드 프로시져의 사용을 권유하고 있다.(물론, 예전부터 그래오기는 했다) 그렇다면, 그토록스토어드 프로시져의 사용을 권유하는 이유는 무엇일까? 이를 사용할 경우 어떠한 장점이 있기에 이를 사용하라고 그토록 이야기하는것일까? 그 중요한 이유 중에 하나는 속도이다. 웹을 다루는 우리에게 언제나 의식할 수 밖에 없는 것이 속도라는 것은 두말할필요가 없을 것이다. 웹 사이트가 갈수록 느려지는 이유 중에 하나는(하드웨어적으로는 문제가 없다고 가정했을 때) 사이트에 많은데이터가 축적되어짐에 따라, 그 데이터를 처리하는 데에 드는 시간이 늘어나기 때문이다. 물론, 갈수록 많은 사용자들이 그러한데이터의 처리를 요구하기 때문이기도 하고 말이다. 어쨋든 갈수록 방대해지는 데이터를 처리하는 데에 드는 속도는 갈수록 떨어질것이기에, 우리는 이 부분에 민감하게 반응할 수 밖에 없다. 물론, 우리가 부유하다면 최고의 장비를 갖추어서 이 문제를 해결할수도 있겠지만, 대부분의 경우 그럴 수가 없는 현실이다.

그리고, 개발자로서의 자존심이 그렇게 모든 것을 돈으로 해결하게 놔두지는 못할 것이기에 프로그래밍만으로 성능의향상을 높일 수 있는 방법이 있다면 그 어떠한 시도도 지나쳐서는 안될 것이다. 웹 사이트의 속도 저하 원인중에 가장 큰 이유는데이터의 처리속도의 저하이다. 그렇다면, 데이터의 처리속도를 조금이라도 증가시킬 수 있다면 웹 사이트의 속도도 증가할 것이라는것은 당연하다. 바로 그러한 이유에서도 이 스토어드 프로시져는 필수적으로 사용할만한 방법인 것이다.

저장 프로시져를 사용할 경우에는 일반 SQL 문을 사용할 경우보다 뛰어난 속도의 향상을 가져올 수 있다. 다음의표는 일반 SQL 문과 저장 프로시져간의 비교이다. 이 비교를 통해 왜 저장 프로시져가 더 빠를 수 있는지 여러분은 느낄 수있을 것이다.


  일반 SQL 구문 저장 프로시저
만들 때 1. 키워드 분리 및 문법 검사(파싱작업)
2. 각 개체의 이름을 확인
3. 권한 및 보안의 점검
4. 옵티마이징 (최적화시킨다)
5. 컴파일의 실행
1. 키워드 분리 및 문법 검사(파싱작업)
2. 각 개체의 이름을 확인
3. 권한 및 보안의 점검
4. 옵티마이징 (최적화시킨다)
5. 결과를 서버에 저장
처음 실행 시 컴파일된 것을 실행한다. 컴파일하고, 이를 어떻게 실행할 것인지에 대한 실행계획을 만들어 캐쉬에 저장하고 난 뒤 실행한다.
이후 실행 시 위의 두 과정을 다시 또 수행 캐쉬를 확인해서 이미 실행계획이 있다면 그를 사용하며, 캐쉬에 실행계획이 없다면 위의 과정을 수행한다.

 

 뭐가 차이가 있다는 것인지 이해가 잘 안가는가? 그렇다면 유심히 보지않아서 그럴 것이다. 다시 한번 자세히 살펴보자. 분명한 차이가 있다. 일반 SQL 구문의 경우는 실행할 때마다 언제나파싱작업, 개체,보안확인 작업, 컴파일 작업을 반복하게 된다. 하지만, 스토어드 프로시져는 처음에만 단 한번 그 작업을수행하고, 그에 대한 모든 사항을 캐쉬에 올려놓게 된다. 해서 이후 실행시에는 파싱작업, 개체, 보안확인 작업, 컴파일 작업은필요하지 않은 것이다.

 웹과 같이 수많은 사용자가 같은 쿼리를 수도 없이 요청하는 경우를 생각해 보라. 매번 "파싱작업, 개체,보안확인 작업, 컴파일작업"을 반복하는 것과, 단 한번만 이를 수행하고 이후는 캐쉬에서 가져와서 빠르게 수행하는 것과는 대단한 차이가 생길 것이다.사이트의 규모에 따라 예상치도 않은 성능의 향상을 가져올 수도 있다.

 그 뿐이 아니다. ASP에서 ADO를 통해서 데이터베이스에 명령을 날리는 경우 , 그 명령라인의 길이가 길수록 더 많은 크기의데이터를 서버로 전송해야 하기에 네트웍의 트래픽도 늘어나게 된다. 그 명령문의 길이가 짧으면 짧을수록 트래픽은 줄어들 것이고말이다. "에이.. 몇 글자나 된다고 그래?" 할지 모르겠지만 이것은 그냥 웃으며 넘길 정도의 문제가 아니다.

글 집필시의 최고 이슈 사이트인 모교사랑(ILoveSchool.co.kr)의 경우 동시 사용자가 5만명에 이르른다고 한다.그렇다면 쿼리문의 한, 두글자의 차이는 5만글자, 10만글자의 차이로 늘어나게 되는 것이다. 이제도 웃을 수 있을까? 스토어드프로시져를 사용하면 이 긴 SQL 구문이 프로시져 내부로 들어가게 되기에 이 트래픽 또한 줄일 수 있다.


 이제는 맘에 들 것이며, 마구 사용하고 싶어질 것이다.

거기다가 다음과 같은 추가적인 이익도 있으니 이마저 듣고나면 스토어드 프로시져를 사용하지 않고는 못 배길 것이다. 그것은 바로보안적인 잇점이다. 이제는 익숙해져버린 ASP Security Hole을 여러분은 알고 계실 것이다. 일명 백도어라고 불리우는ASP 소스를 훔쳐볼 수 있는 방법말이다. 만일, 여러분이 ASP 페이지에서 일반 SQL 구문을 사용하여 페이지를 구성하였다면,이 백도어가 오픈될 경우 이 쿼리는 모두 노출될 수 있을 것이다. 하지만, 스토어드 프로시져를 사용한다면 모든 SQL 문은프로시져 내부로 숨어있기에, 단지 프로시져의 이름만이 노출될 뿐, 안심설계일 수 있는 것이다.

그렇다. 저장 프로시져의 사용은 여러모로 우리에게 유용하다. 그렇다면, 이런 기분좋은 느낌으로 이를 공부해보도록하자. SQL 서버 BOOKS ONLINE(SQL 설치하면 같이 설치되는 도움말) 이나 SQL 서버책에서 이 스토어드 프로시져를만드는 구문을 살펴보면 다음과 같을 것이다.

CREATE PROC[EDURE] procedure_name [;number]
    [
        {@parameter data_type} [VARYING] [= default] [OUTPUT]
    ]
    [,...n]
[WITH
    {
        RECOMPILE
        | ENCRYPTION
        | RECOMPILE, ENCRYPTION
    }
]
[FOR REPLICATION]
AS
    sql_statement [...n]

오오... 대단히 어려워 보인다. 데이터베이스를 전문으로 하지 않는 한, 각각의 인자들이 어디에 어떻게 쓰이는지모두 기억하고 있기는 어려울 것이다. 이 구문에 대한 자세한 사항은 안타깝게도 여기서 모두 다룰 수는 없다. 이 책은 ASP책이며, 그 본분을 다하고 싶기 때문이다. 더욱 자세한 사항은 SQL 서버 책을 살펴보셔야 할 것이다.(BOOKS ONLINE도좋다) 그렇기에 더욱 자세한 부분들에 대해서는 여러분이 차후 시간이 날 경우에 스스로 학습법을 통해서 습득하시기를 바라며,우리는 이 책에서 필요한 정도의 수준만을 같이 해 보려 한다. (좀 더 중급 개발자가 되기 위해서는 SQL 서버는 아니더라도또한, 아주 깊이 있게는 아니더라도 반드시 한 개이상의 데이터베이스를 다룰 수가 있어야 할 것이다. 알고보면 우리도 언제나노력해야 하는 고된 직업을 가지고 있다. )

일단, 위의 구문을 따르는 가장 간단한 예문을 보면 다음과 같다.

CREATE PROC usp_UpdatePrice_Titles
AS
    Update titles SET price = price * 1.2

이렇게 바라보니 어렵지 않다. 가장 간단한 구문의 스토어드 프로시져는 다음과 같은 구성을 지니게 된다.

CREATE PROC(혹은 PROCEDURE) 프로시져 이름
AS
    수행할 SQL 쿼리문장

오오, 이제는 이해하고 싶어지려 한다. 뭐든지 쉬운 것부터 접근해 나가는 것을 필자는 좋아한다. 처음부터 너무어렵게 시작하면 뭐든지 하기가 싫어지는 법이니 말이다. 왠지 초보취급을 하듯이 이야기하는 것 같다고 느낀다면, 필자가 처음에스토어드 프로시져를 알기 위해서 꽤나 어렵게 공부했기에. 그렇기에 여러분에게는 쉽게 풀어주기 위해서 노력하고자 하는 것이니양해해 주길 바라며, 이미 기본지식을 가지고 있는 사람은 적당히 자신에게 맞는 부분으로 속독하며 보아나가면 될 것 같다.

쿼리 분석기(Query Analyzer)를 열고 다음과 같은 구문을 입력해보도록 한다.

-- pubs를 사용한다고 설정
Use pubs

-- 가장 비싼 책의 가격을 확인
Select max(price) from titles
GO

-- 프로시저 생성
CREATE PROC usp_UpdatePrice_Titles
AS
Update titles SET price = price * 1.2
GO

-- 만들어진 프로시저를 실행
Exec usp_UpdatePrice_Titles
GO

-- 가장 비싼 책의 가격을 확인
Select max(price) from titles

먼저 위에서 사용한 SQL 문들을 살펴보도록 하자. 먼저 Select max(price) from titles 를통해서 현재 책 가격중에 가장 비싼 책의 가격을 먼저 알아보도록 한다. 그래야, 책의 가격을 변동시킨 뒤, 제대로 변경되었는지확인이 가능할테니 말이다. 그 다음에 Go 라고 되어져 있는 것은 SQL 서버에서 쿼리를 수행할 경우, 각각의 배치를 구분하기위해서 사용한 것이다. 스토어드 프로시져를 만드는 작업이전에는 어떠한 명령도 이전에 존재하지 않아야 하기에 Go를 두어 이전의작업을 먼저 끝내게 한 것이다.

그리고 난 뒤, 저장 프로시져를 만든다. 이 프로시져의 이름은 usp_UpdatePrice_Titles 이며,이름은 여러분이 원하는대로 주어도 무관하다. 그리고, 이 프로시져는 Update titles SET price = price *1.2 란 쿼리를 수행하도록 만든 것을 볼 수가 있을 것이다. 이 프로시져가 만들어지면 이후로는 Update titles SETprice = price * 1.2 대신에 usp_UpdatePrice_Titles를 실행시켜도 같은 결과를 볼 수가 있을것이다.

이제 프로시져는 만들어 졌다. 그렇다면, 이 만들어진 프로시져를 실행해보도록 하자. 사용자가 만든 저장 프로시져를실행하기 위해서는 EXEC 라는 명령을 사용하면 된다. 해서 소스에서는 EXEC usp_UpdatePrice_Titles를사용하여 우리가 만든 프로시져를 수행하도록 하고 있다.

그리고, 다시 가장 비싼 책의 가격을 알아보니 20% 인상이 되어져 있는 것을 알 수가 있다. 이것은 위의 쿼리가 수행되면서 나타나는 결과화면으로 원래의 가격과 인상된 가격의 모습을 볼 수가 있다.

---------------------
22.9500
Warning: Null value eliminated from aggregate.

---------------------
27.5400
Warning: Null value eliminated from aggregate.

결과중에 있는 경고는 책값중에 값이 NULL 인 것이 있어서 나는 경고이니 심각하게 받아들이지 않아도 된다. 일반적인 SQL구문을 스토어드 프로시져로 바꾸는 것은 그리 어렵지 않았다. 간단하게만 사용한다면 저장 프로시져도 그렇게 어렵지는 않다.

이번에는 이 저장 프로시져에 인자를 넘기는 예를 한번 해보도록 하자. 우리 회사에서 갑작스러운 이유로 특정 타입의책들에 대해서는 수시로 가격을 조금은 올리는 경우가 잦다고 가정을 해 보자. 물론, 실제상황에서 그런 일은 없을테지만 단지 예에불과하니까 "예"하고 같이 해보자.

위와 같은 상황이라면 어떤 쿼리문이 필요할까? 다음과 같은 쿼리문이 필요할 것이다.

Update titles SET price = price + 올릴가격
Where type = 올릴가격의 책 타입

그렇다면, 이번에는 이것을 프로시져로 만들어 보도록 하자. 그렇다면 이 프로시져로는 두 개의 인자를 넘길 수 있어야할 것이다. 올릴 가격에 대한 값과, 값을 올릴 책의 타입을 말이다. 그런 경우에는 프로시져를 어떻게 제작해야 하는가? 다음처럼하면 된다.

CREATE PROC usp_UpdatePrice2_Titles
    @type char(12),
    @plus int
AS>
    Update titles SET price = price + @plus
    Where type = @type

프로시져에서 사용하는 변수는 @하나로 시작한다. 위의 소스에서 보면 프로시져 이름 뒤로, 프로시져 내부의 SQL문에서 필요한 두가지의 인자를 넘기도록 하는 것을 볼 수가 있다. 변수이름은 여러분이 원하는 대로 줄 수 있지만, 그 변수의타입은 잘 맞추어 주어야 한다. 우선 첫 번째 인자로는 책의 타입을 넘겨줄 것이기에 변수 이름을 @type 그 데이터타입은char(12)으로 준 것을 볼 수있다. 그 다음 인자로는 , 를 구분자로 하여 @plus 라는 지정하고 있는데, 이는 책의인상가격이 될 것이다. 데이터 타입은 int 이고 말이다. 이렇게 프로시져 뒤로 두 개의 변수를 받아들이게 되면, 프로시져내에서는 이 값을 가지고 처리를 할 수 있게 된다.

이번 프로시져에서는 이 넘어온 두 개의 변수를 사용해서 특정 타입의 책 가격을 특정 값만큼 인상하고 있다. 어렵지 않은 편이다. 그럼 실제로 한번 이 프로시져를 만들어 보자.

Query Anayzer 에다 위의 프로시져 구문을 입력하고 실행해 보자. 오타 없이 잘 수행했다면 여러분은The command(s) completed successfully.란 메시지를 받을 것이다. 이제 이 프로시져는 만들어 졌다.그렇다면, 이제 이 프로시져를 사용해 보도록 하자. 우리는 책중에서 Business 타입인 책들의 가격을 10 달러 인상시킬계획이다. 그렇게 한번 해보자.

이 프로시져를 사용하기 전에 확인차원에서 현재 titles 테이블의 Business 타입의 책중에 가장 비싼 책의 값이 얼마인지 미리 확인해 두도록 하자. 다음 쿼리를 통해서 말이다.

Select max(price) from titles Where type = 'business'

위에서부터 주욱 따라하셨다면 이 값은 23.988 라고 나올 것이다. 이 값을 기억해 두자. 23.988 이 아니라면 그래도 좋다. 하지만, 그럴 경우 그 값을 어딘가에 적어두도록 하자.

이제 다음처럼 프로시져를 사용해 보도록 하자.

Exec usp_UpdatePrice2_Titles 'business', 10

주의할 것은 우리가 프로시져를 만들 때, 첫 번째 인자가 char인 타입 컬럼, 두 번째 인자가 인상할 가격인plus 이었으므로 그 순서에 맞추어 값을 넣어주어야 한다는 사실이다. 만일, 그 순서와 무관하게 가격을 넣고 싶다면, 다음처럼그 변수이름을 사용해서 값을 넣을 수도 있다.

Exec usp_UpdatePrice2_Titles @plus=10, @type=business

프로시져를 수행했다면 Select 쿼리를 통해서 가격이 10 달러 증가했는지 확인해 보도록 하자. (필자의 경우라면 가격은 33.988이 되어져 있다.)






이전 강좌에 이어서, 프로시져에 관해서는 이 외에도 OUTPUT을 받아내는 방법과 Return 값을 받아내는 방법등이 존재한다.이들은 각각 프로시져에 인자값을 전달하는 것뿐 아니라, 어떤 결과나 리턴값을 받아낼 수도 있도록 하는 방법이다. 이번에는 이들방법에 대해서 알아볼 차례이다. 그렇다면, 먼저 OUTPUT를 사용하는 방법에 대해서 알아보도록 하자. 쿼리 애널라이저에서다음과 같은 프로시져를 만들어 보자. 굵은 부분이 이번 프로시져에 추가가 된 부분이니 유심히 바라보기 바란다.

CREATE PROC usp_UpdatePrice_Output
    @type    char(12),
    @plus    Float,
    @MaxPrice    Float OUTPUT
AS
Begin
    Update titles SET price = price + @plus
    Where type = @type

    Select @MaxPrice = max(price) from titles Where type = @type
End

OUTPUT 라는 것은 저장 프로시져에게 인자값을 전달하는 것만이 아니라 되돌려 받을 수도 있게하는 키워드이다.위의 스토어드 프로시져를 보면 알겠지만, 위의 내용은 지정한 타입의 책의 가격을 지정한 만큼 인상한 후, 그 인상한 책중에서가장 비싼 책의 값을 매개변수로써 돌려받는 내용을 갖는다.

돌려받은 값의 변수이름과 변수타입을 지정한 다음,(여기까지는 기존의 입력인자와 같다) 이 변수는 값을 되돌려 받는데에 사용한다는 의미로 OUTPUT 이라는 키워드를 붙여준다. 그렇게 되면, 이 인자를 통해서 우리가 원하는 값을 얻어올 수있게된다.

소스를 바라보면, 우리는 특정값을 되돌리기 위해서 @MaxPrice라는 변수를 지정했음을 볼 수가 있다. 그리고, 이 변수는Update 문을 진행한 다음 업데이트된 값중에서 가장 큰 값을 저장하게 됨을 볼 수가 있다. 그 문장이 바로 Select@MaxPrice = max(price) from titles Where type = @type 이다.

이렇게 되면 우리가 지정한 인자값에 따라 프로시져는 동작하며, 그 결과 적용된 책중에서 가장 비싼 책의 가격을@MaxPrice 라는 변수를 통해서 되돌려주게 된다. 그렇다면, 어떻게 그렇게 할 수 있는지 이 프로시져를 실행하는 예를보도록 하자. 다음이 그 예이다.

Declare @MaximumPrice    Float
Set @MaximumPrice = 0
EXEC usp_UpdatePrice_Output 'business', 10 , @MaximumPrice OUTPUT
Select @MaximumPrice

위의 구문이 바로 그 되돌림이 있는 프로시져를 수행하는 예인데, 조금은 복잡해 보이지만 알고보면 그렇지도 않다.프로시져를 수행하는 것도 프로그램의 일종이기에 자체적인 문법도 있고, 변수를 사용하게 되면 변수의 선언도 필요하다.(SQL서버의이 프로그래밍을 T-SQL이라고 한다) 우리가 이 되돌림이 있는 프로시져를 사용하는 실제적인 구문은 위에서 굵게 처리한 다음구문이다.

EXEC usp_UpdatePrice_Output 'business', 10 , @MaximumPrice OUTPUT

하지만, 이 구문에는 @MaximumPrice 라는 변수가 사용되어진다. 그렇기에 변수의 선언과 변수의 초기화가 필요하다. 해서

Declare @MaximumPrice    Float
Set @MaximumPrice = 0

이 두 줄이 먼저 선행되어진 것이다. 그리고, 실제 프로시져 실행구문을 구동한다. 그렇게 되면 프로시져는 동작할것이며, 책 중에서 Business 타입인 책들의 가격을 10 달러씩 증가시킬 것이다. 그리고, 이미 우리가 작성한대로 이업데이트된 가격 중에서 가장 비싼 가격을 @MaximumPrice 라는 변수를 통해서 돌려줄 것이다. 이제 우리가 할 일은 그돌려받은 값이 얼마인지 확인하는 일이다. 필자의 경우 프로시져 수행전의 가격은 33.988 이었으며, 수행 후의 가격은43.988 이 되었다.

참고 : 프로시져를 삭제하는 방법은?

어쩌면 Delete를 생각했었을지 모르겠다. 하지만, 실은 Drop이다.
Drop PROC usp_UpdatePrice_Output 과 같이 실행하면 프로시져를 없앨 수 있다.

조금은 방법이 복잡해 보이지만, 이것은 T-SQL을 사용할 경우의 테스트 방법이며, ASP에서는 나름대로의 사용방법이 따로 존재한다.

T-SQL이란?

MS SQL 서버에서 사용이 가능한 확장형 SQL 로써, SQL 표준을 따르면서 나름대로 자신을 확장시켜 좀더 세세하게 여러 정보를 다룰 수 있게 한 프로그래밍이 가능한 확장된 SQL이라고 볼 수 있다.

사실, 결과를 되돌려 받기 위해서는 OUTPUT를 사용하지 않고, 그냥 Select 문으로 레코드셋 자체를 넘길 수도 있다. 위의 프로시져는 다음과 같이 사용해도 같은 결과를 나타내게 될 것이다.

CREATE PROC usp_UpdatePrice_Output
    @type    char(12),
    @plus    Float,
AS
Begin
    Update titles SET price = price + @plus
    Where type = @type

    Select max(price) from titles Where type = @type
End

이렇게 되면, OUTPUT 인자없이도 레코드를 반환할 수가 있다. OUTPUT 의 경우는 오직 하나의 값을 리턴할경우 유리하며, 많은 레코드를 리턴하고 싶을 경우는 이 방법을 사용하는 것이 좋다. 사실 OUTPUT을 사용하는 방법은 그리자주 사용되는 방법은 아니다.

프로시져내의 Begin 과 End 란 무엇인가?

이는 구문의 실행과 끝을 알리는 역할을 하는 키워드이다. 실행명령이 한줄로 끝나지 않고, 여러 라인에 걸쳐 여러 명령을수행해야하는 경우 그 구역을 모두 수행하라는 의미로 Begin으로 시작하여 End로 맺음하고 있는 것이다. 마치 자바스크립트나C++에서 { }와 같은 의미이다. T-SQL 에서는 그를 Begin과 End 라는 키워드로써 구분하게 하고 있다. 이미언급했듯이 T-SQL도 프로그래밍 언어에 속하기에 이 또한 자신만의 문법을 가지고 있다.

또, 다르게 값을 되돌릴 수 있는 방법으로는 RETURN 방법이 있다. 이는 사실 프로시져를 마치면서 또는, 비정상 종료하면서Return값을 지정해서 이 프로시져를 호출한 클라이언트가 현재 어떻게 종료되었는지등을 판단하게 하기 위한 수단으로 사용되며,처리결과를 간단히 알리는데 사용되어지게 된다. 주의할 것은 리턴 값은 정수만이 가능하다. (주로 1 아니면 0이다.)

다음은 Return을 사용하는 프로시져의 예이다. 이 프로시져는 business 책 중에 가장 비싼 책의 가격을인상하기 이전에 그 책의 가격이 50 달러 이상이라면 책 값을 더 이상 인상하지 않고 0을 리턴하게 되며, 아직 50달러미만이라면 가격을 인상한 뒤에 1 이라는 값을 리턴하게 될 것이다.

CREATE PROC usp_UpdatePrice_Return
    @type    char(12),
    @plus    Float
AS
Begin
    Declare @Check    int

    Select @Check = Max(price) from titles
    Where type = @type

    if @Check < 50
        Begin
            Update titles SET price = price + @plus
            Where type = @type

            Select @Check = 1
        End
    Else
        Select @Check = 0

    Return @Check
End

그러면, 이 구문을 실행해서 결과를 얻어오려면 어떻게 이 구문을 실행해야 할까?

Declare @rtn    int
EXEC @rtn = usp_UpdatePrice_Return 'business', 10
Select @rtn

이 바로 그것이다. OUTPUT의 경우와 비교했을 때, 약간의 차이가 있다. 구문의 경우는 OUTPUT 의 경우와는달리 돌려받은 값의 변수이름은 지정하지 않는다. 그리고, 실행시에는 리턴값을 받기위해, 프로시져 이름 앞에서 프로시져의 결과를대입하는 모습을 띈 @rtn = usp_UpdatePrice_Return 가 인상적이다. 어려울 것은 없다. OUTPUT 보다는조금은 단순한 모습을 띄고 있으니 말이다.

지금의 예는 뭔가 현실적이지는 못하지만, 여러분은 여러 가지 모습으로 이러한 Return 값을 가지는 프로시져를 구성할 수 있을것이다. 예를 들면, 회원가입시 현재 등록하고자 하는 사람의 아이디가 이미 존재하는지의 여부를 체크해서 존재한다면 1, 아니라면0을 리턴하여 처리할 수도 있을 것이다.

조금은 부족한 듯 하지만, 스토어드 프로시져의 사용법에 대해서 우리는 알아보았다. 이들은 간단하지만 가장기본적인 프로시져의 사용예이니 적어도 이 정도는 이해하고 있어야만 한다. 이미 언급했듯이, 더욱 자세한 스토어드 프로시져에 대한내용은 관련서적을 통해서 얻으셔야 한다. 이 스토어드 프로시져를 작성하는 구문이나 문법에 대해서는 T-SQL 문을 또한, 따로공부하셔야 한다.

여러분의 마음은 필자도 알고 있다. 여기서 T-SQL 문법이나 구문에 대해서도 알려주었으면 한다는 것을 말이다. 하지만, 그것이 그리 쉽지 않은 것이 T-SQL은 그것만으로도 두꺼운 책 한권이다. 역시 그도 하나의 언어이기 때문이다. 해서, 그를 여기서 설명한다는 것은 무리가 있다. 그에 대한 지식은 여러분이 필요한 만큼 SQL 서버 책이나 T-SQL 책 내지는 SQL Books Online을 통해서 얻으셔야만 한다. 

이 지식은 여러분이 ASP 에서 ADO Command 개체를 사용하고자 할 경우나, ADO.NET의 Command 관련 개체들을 사용할 경우 아주 유용한 지식이 되어줄 것이라 믿어 의심치 않는다.



원본 출처
http://taeyo.pe.kr/lecture/10_ADO/SP01.asp
http://taeyo.pe.kr/lecture/10_ADO/SP02.asp