2009-08-26 6 views
1

아래의 SQL 코드를 참조하십시오.이 쿼리를 개선 할 수 있습니까?

DECLARE @RET TABLE(OID BIGINT NOT NULL,rowid bigint identity); 
DECLARE @ResultTbl TABLE(OID BIGINT,sOID BIGINT,partkey bigint); 

DECLARE @PATOID as VARCHAR(4000) 

SET @PATIENTOID= '95,96,192,253,110,201,201,83,87,88,208,208,208,208' 
INSERT INTO @RET SELECT OID FROM dbo.FGETBIGINTLIST(@PATOID) 


DECLARE @NoOfRows bigint 
DECLARE @InOID bigint 
select @NoOfRows = max(rowid) from @RET 

while (@NoOfRows >=1) 
begin 
    select @InOID = oid from @RET where [email protected] 
    insert into @ResultTbl 
      select * from fresolve_11(@InOID) 
    set @NoOfRows = @NoOfRows - 1 

end 

SELECT * FROM @RET 
SELECT * FROM @ResultTbl 

함수 FGETBIGINTLISTfresolve_11가 FGETBIGINTLIST 의해 반환 BIGINT 데이터를 받아들이는 단지

OID 

95 
96 
192 
253 
110 
201 
201 
83 
87 
88 
208 
208 
208 
208 

및 함수처럼 .. 파라미터로서 콤마 분리 된 값을 받아 테이블 형식의 값을 반환 이 형식의 출력을 반환합니다.

OID     sOID     PartKey 
-------------------- -------------------- ----------- 
95     95     6 

내 요구 사항은 fresolve_11를 작동하려면 FGETBIGINTLIST에 의해 반환 된 각 데이터를 전달하는 것입니다 그리고 그것은 내 쿼리가 완벽하게 작동하고 예상 결과를 반환이

OID     sOID     partkey 
-------------------- -------------------- -------------------- 
208     208     29 
208     208     29 
208     208     29 
208     208     29 
88     88     29 
87     87     28 
83     83     24 
201     201     22 
201     201     22 
110     110     21 
253     253     14 
192     192     13 
96     96     7 
95     95     6 

같은 결과 집합을 반환해야합니다. 그러나 while 루프와 2 개의 테이블 변수를 사용하지 않고 더 나은 대안을 찾고 있습니다.

미리 감사드립니다.

건배

라 메쉬 VEL

답변

5

나는 그것을 나 자신을 지켜 볼 수밖에 없었습니다,하지만 :

SELECT result.* 
FROM dbo.FGETBIGINTLIST(@PATOID) AS OIDs 
OUTER APPLY dbo.fresolve_11(OIDs.OID) AS result 

작품을 나를 위해. SQL Server 2005 이상이어야합니다.

MSDN page on APPLY (SQL Server 2005 버전)을 참조하십시오.

+0

Thorarin에게 감사드립니다 ... 그 awsome ... 나는 결코 abt를 생각하지 않는다. .. 당신은 단지 성명서에서 그것을했다. .. – RameshVel

관련 문제