보통 SP에서 임시테이블을 사용할 경우에 ASP에서는 해당 레코드셋을 받아올 수 없다고 생각하는 프로그래머들이 의외로 많다. 하지만 그것은 틀린 생각이다. SP를 좀 더 명확하게 작성해주면 된다.


[code type="sql"]
Create Proc spTestB AS
DECLARE @Results Table (ID TinyInt)
INSERT INTO @Results SELECT ID FROM FileList

SELECT ID FROM @Results
GO
[/code]
예를 들어서 위와같은 SP가 있다고 하고 ASP 페이지에서

Set List = objConn.Execute("Exec TestB")

를 실행했다고 하면 대부분 "개체가 닫혀있으면 작업이 허용되지 않습니다." 라는 에러 메세지를 보게 된다.

물론 그냥 SQL 쿼리 분석기에서 실행하면 아주 잘 동작한다.  하지만 ASP에서 해당 레코드셋을 받아오려고 하면 동작하지 않는다. 이는 위의 테이블이 임시테이블이던지 혹은 실제 테이블이던지 상관없다.

왜 그럴까? 이는 우리가 결과를 리턴받기를 원하는 레코드셋을 제대로 받아오지 못하기 때문이다.

두가지 해결방법이 있는데..

1. OLE DB를 사용하지 않고 ODBC를 사용하면 해결된다. - 하지만 호스팅을 이용한다고 하면 이렇게 쓸수는 없지 않은가...

2. SP 자체를 바꾸면 된다 ^^;

[code type="sql"]
Create Proc spTestB AS
SET NOCOUNT ON
DECLARE @Results Table (ID TinyInt)
INSERT INTO @Results SELECT ID FROM FileList

SET NOCOUNT OFF
SELECT ID FROM @Results
GO
[/code]

두번째 SP에서는 SET NOCOUNT ON 과 SET NOCOUNT OFF의 위치를 주의해서 보면 됩니다.

SET NOCOUNT에 대해서는 MSSQL 도움말을 참고하기 바랍니다.


'프로그래밍 > ASP, Javascript' 카테고리의 다른 글

File 타입 객체에 직접 입력못하도록 막기  (0) 2007.02.06
ADO DataType Mapping  (0) 2007.01.25
CursorType 및 상수  (0) 2006.11.01
Builder Pattern  (0) 2006.10.09
AJAX 관련 홈페이지  (0) 2006.09.25

//