2009-08-26 5 views
1

Bitte sehen Sie sich den folgenden SQL-Code an.kann diese Abfrage verbessert werden?

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 

Die Funktion FGETBIGINTLIST akzeptiert ein Komma getrennt Wert als einen Parameter und gibt den Wert in Tabellenformat .. wie

OID 

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

und Funktion fresolve_11 durch die FGETBIGINTLIST Bigint Daten zurückgegeben akzeptiert und gibt die Ausgabe in diesem Format zurück

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

Meine Forderung ist jeweils Daten durch den FGETBIGINTLIST zurück passieren fresolve_11 funktionieren und es soll eine Ergebnismenge wie diese

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 

Meine Abfrage funktioniert perfekt und gibt das erwartete Ergebnis zurück. Aber ich suche nach besseren Alternativen, ohne While-Schleife und 2 Tabellenvariablen zu verwenden.

Vielen Dank im Voraus.

Prost

Ramesh Vel

Antwort

5

Ich hatte es mich zu sehen, aber:

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

Arbeiten für mich. Sollte SQL Server 2005 und höher sein.

Siehe MSDN page on APPLY (SQL Server 2005-Version).

+0

danke Thorarin ... es ist fantastisch ... ich denke nie, dass ... du hast es nur in einer einzigen Aussage getan ... – RameshVel

Verwandte Themen