这个查询可以改进吗?

时间:2009-08-26 10:41:11

标签: sql sql-server sql-server-2005 query-optimization

请查看以下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 rowid=@NoOfRows
    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个表变量。

提前致谢。

干杯

Ramesh Vel

1 个答案:

答案 0 :(得分: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版)。