2010-05-02 3 views
0

SELECT의 결과를 변수에 넣고 결과를 반복하여 동일한 저장 프로 시저에서 해당 데이터를 조작하려고합니다. 지금까지이 :SQL 선택을 SQL 변수로 되돌릴 수있는 방법

DECLARE @i int 

@Result = (SELECT * FROM UserImport) 

SET @i = 0 
WHILE @i < (SELECT Count(@Result) As Count) 
BEGIN 
    /* Do Stuff */ 
END 

나는 @Result 선언되지 않았습니다 말하는 때문에 해제 방법이야 알지만, 나는 SELECT 문의 결과를 보유 할 수있는 변수를 선언하는 방법을 모르겠어요.

아무도 내가 잘못 가고 어떻게 고치려하는지 알려 줄 수 있습니까?

감사합니다,
매트

+4

/* Do It * * /? 더 나은 해결책이있을 수 있습니다. – BradBrening

답변

2

커서를 사용할 수 있습니다. 적어도 그렇게하는 것은 전통적인 방식입니다. 요청한대로 while 루프를 사용할 수도 있습니다. 커서 및 대안에 대한 예제는이 기사를 참조하십시오.

Avoiding SQL cursors

1

당신은 이들의 이상 기반 작업을 설정 항상을 선호한다, 대신 테이블 변수 커서

물론

http://www.eggheadcafe.com/PrintSearchContent.asp?LINKID=529

을 사용하는 것이 좋습니다. SQL은 집합 기반 작업을 위해 설계되었습니다.

+0

커서가 루프 최악의 방법은 구글'SQL 서버 커서 무료 루핑',이 같은 많은 기사가 있습니다 : http://searchsqlserver.techtarget.com/tip/Avoid-cursors-in-SQL-Server-with-these -methods-to-loop-over-records –

1

오히려 결과를 통해 반복의 관점에서 생각보다은 "물건을 할"부분을 열심히 보면 당신은 루프 또는 커서 않고 한 단계로 모든 것을 할 수 있는지.

가능한 경우 수행해야 할 실제 작업에 대한 자세한 내용을 게시하십시오. 가능한 경우 커서가 필요하지 않습니다.

0

루핑은 데이터베이스 성능을 저하시키는 최악의 방법 중 하나입니다!

나는이 같은 선택 하나의 명령에 문 것을 처리하려고 제안

:

DECLARE @Current int, @LastRow int 
DECLARE @Col1 datatype, @Col2 datatype .... 
DECLARE @Results table (RowId int identity1,1) primary key, col1 ...,col2 ...) 

INSERT INTO @Results SELECT * FROM UserImport 
SELECT @Current=0, @[email protected]@ROWCOUNT 

WHILE @Current<@LastRow 
BEGIN 
    SET @[email protected]+1 
    SELECT @Col1=Col1, @Col2=col2 FROM @Results WHERE [email protected] 

    /* Do Stuff */ 

END 

당신 같은 경우는 루프 이런 식으로 수행해야하는 경우에는

UPDATE t2 
    SET Cola=t1.col1, Colb=t1.col2 
    FROM UserInput t1 
    JOIN YourTable t2 ON t1.id=t2.id 

을 100 행 이상을 처리하고 있습니다. 테이블 변수를 @Results 임시 테이블로 대체하십시오 :

CREATE TABLE #RESULTS (RowId int identity1,1) primary key, col1 ...,col2 ...) 

때문에 더 빠를 것입니다.

관련 문제