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