можно ли улучшить этот запрос? - PullRequest
1 голос
/ 26 августа 2009

Пожалуйста, ознакомьтесь с приведенным ниже кодом 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 принимает данные bigint, возвращаемые FGETBIGINTLIST, и возвращает выходные данные в этом формате

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 и двух табличных переменных.

Заранее спасибо.

Приветствия

Рамеш Вэл

1 Ответ

5 голосов
/ 26 августа 2009

Я сам должен был посмотреть, но:

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

У меня работает. Должен быть SQL Server 2005 и выше.

См. Страницу MSDN в APPLY (версия SQL Server 2005).

...