2009-08-26 62 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 

功能FGETBIGINTLIST接受逗號分隔值作爲參數,並返回以表的格式值..就像

OID 

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

和功能fresolve_11接受由FGETBIGINTLIST返回的BIGINT數據並將以此格式返回輸出

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

我的要求是通過由FGETBIGINTLIST返回函數fresolve_11每一個數據,它應該返回這樣設置

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 2009-08-26 11:38:56