2009-08-26 5 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はFGETBIGINTLISTによって返さbigint型データを受け入れるだけ

OID 

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

及び機能fresolve_11よう..パラメータとしてカンマ区切り値を受け入れ、表形式の値を返しますこの形式の出力を返します

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つのテーブル変数を使用せずに、より良い選択肢を探しています。

ありがとうございます。

乾杯

ラメシュ・ヴェル

答えて

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

関連する問題