database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 1902 게시물 읽기
No. 1902
137번 에러는 어떻게 처리해야하나요?
작성자
고영훈(kyh9052)
작성일
2005-04-21 17:46
조회수
2,145

declare @ID int
declare @TableName varchar(20)
declare @FieldName varchar(20)

 

set @TableName = 'Player'
set @Filedname = 'PID'


declare ID_Cursor cursor for select @Filedname from @TableName
open ID_Cursor

...

 

이렇게 테이블과 필드의 이름을 바꾸어서 수행하려합니다

 

같은 내용이 반복되기에 필드와 테이블만 바꿔 수행하려합니다

 

그런데 커서를 선언하는부분에서 137번 에러가 납니다

 

설명서를 보니 외부에서 선언한 변수를 사용했기때문이라는데

 

어떻게 해야 필드와 테이블 값을 변수로 넘길수 있을까요?

이 글에 대한 댓글이 총 4건 있습니다.

137번 에러가 그 에러인지는 잘 모르겠지만

제가 보기엔 변수를 받는 부분에서 다른 변수를 입력하려고 할때

나는 에러인 것 같습니다.

즉 cursor를 받으려고 하는 곳에서 table변수를 사용하려고 하여

나는 에러입니다.

 

declare ID_Cursor cursor for select @Filedname from @TableName

이게 불가한 문장입니다.

여리님이 2005-04-21 17:54에 작성한 댓글입니다. Edit

반드시 cursor를 써야할 이유가 없다면,

@table 변수 혹은 임시테이블을 cursor 대용으로 쓸수 있습니다..

아니, cursor보다 성능이 더 좋져~ 부하도 안 주구여~

원 테이블이랑 연결을 끊어버리니까.. 그게 장점이자 단점이지만여..

 

그렇게 하면 sp_executesql을 이용해서 동적 query를 만들어서 실행시킬 수 있지 않을까 싶은데요..

(이건 테스트 안해 봐서 잘 모르겠지만, 아마 될 겁니다..)

 

그럼..

길가는 나그네..님이 2005-04-21 17:57에 작성한 댓글입니다. Edit

 ID_Cursor 는 반드시 써야합니다

 서로 다른 필드와 테이블에 같은 내용이 반복되기에 필드와 테이블만 바꿔 수행하려한건데 제가 불가능한 문장을 생각한건가요?

 필드랑 테이블이 좀 많아서요...

 소스 여러개 놓고 그부분만 찾아 고치기 힘들구 나중에 필드나 테이블바뀌었을때도 보기 편할거 같아서.. ㅠ,.ㅠ

 

고영훈(kyh9052)님이 2005-04-21 18:06에 작성한 댓글입니다.
이 댓글은 2005-04-21 18:06에 마지막으로 수정되었습니다.

제 얘기를 잘못 이해하신 것 같네여~

cursor는 반드시 쓰지 않아도 될 겁니다..

 

이하는 간단히 pubs에서의 예제입니다..

참고가 되시기를...

 

그럼..

 

이하 예제)


use pubs
go

declare @tName varchar(20)
declare @fName varchar(20)
declare @query nvarchar(1000)
declare @idx int
declare @max int
declare @val varchar(20)

create table #tmp(
  uid int identity(1,1)
, f varchar(20)
)

set @tName = 'titles'
set @fName = 'title_id'
set @query = 'insert into #tmp select ' + @fname + ' from ' + @tName
exec sp_executesql @query -- cursor의 open에 해당

select @idx = 1, @max = max(uid) from #tmp
while @idx <= @max
begin
  select @val = f from #tmp where uid = @idx  -- fetch & next fetch에 해당
  print @val  -- 원하는 작업은 여기에...
  set @idx = @idx + 1
end

drop table #tmp  -- close, deallocate에 해당

 

 

 

참..

이런 거는 usp(user-defined SP ^^*)로~

길가는 나그네..님이 2005-04-21 19:29에 작성한 댓글입니다.
이 댓글은 2005-04-21 19:32에 마지막으로 수정되었습니다. Edit
[Top]
No.
제목
작성자
작성일
조회
1905ㄱ 검색하기 [1]
teriness
2005-04-22
1581
1904temp table의 수명?? [3]
나금보
2005-04-22
2132
1903트러스터된 SQL Server 연결과 관련되지 않았습니다. [1]
달나라
2005-04-21
2046
1902137번 에러는 어떻게 처리해야하나요? [4]
고영훈
2005-04-21
2145
1901칼럼 수가 550개 이상이나.. [2]
길가는 나그네..
2005-04-21
2500
1899이런 경우 쿼리를 어케 만들어야 할지요.. 급합니다.. [3]
dde
2005-04-21
2185
1898이 에러는 무엇인가요 The DBMS returned an unspecified error. [1]
jay
2005-04-21
3178
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.022초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다