2014-10-16 5 views
0

У меня есть таблица дат, который передается в скалярной функции:Множественные Результаты скаляра для выбора

выбрать GETVAL («1/1/1») возвращает поплавок.

Я прокручиваю свою таблицу дат и устанавливаю @date, , затем сохраняя результат на @result, а затем выполняю запись этого значения.

Как получить несколько результатов (с несколькими скалярными вызовами) без выполнения цикла? Мне сказали, чтобы стараться держаться подальше от выполнения циклов внутри sql, и что есть лучший способ выполнить эту операцию.

Пример:

@DateTable 
ID Dates 
1 1/1/1 
2 1/3/1 
3 1/4/1 
4 1/2/2 
5 1/3/2 
6 4/15/12 

set @k = 1 
while @k <= (select count(ID) from @DateTable) 
begin 
    set @date = select Dates from @DateTable where ID = @k 
    set @result = (select mySchema.getVal(@date)) 
    insert into @ResTable(result,logged) values (@result, LOG(@result)) 
    set @k = @k + 1 
end 
+0

Можете ли вы предоставить схему, образцы данных, ожидаемые данные и любой имеющийся у вас код, который работает сегодня? –

+1

Что означает «выполнение журнала по этому значению»? Какую базу данных sql вы используете? Является ли getVal() скалярной функцией, которую вы определили? Что оно делает? –

+0

Пошел вперед и добавил пример того, как выглядят мои данные. Скалярная функция возвращает только значение float и только одно значение, но мне не разрешено изменять функцию. – aperture

ответ

1

Вы можете упростить это:

INSERT @ResTable (Result, Logged) 
SELECT d.Result, LOG(Result) 
FROM ( SELECT Result = mySchema.getVal(Dates) 
      FROM @DateTable 
     ) AS d; 

Я подозреваю, что если вы покажете, что mySchema.getVal() делает, это, вероятно, может быть более эффективным по-прежнему.


Чтобы ответить на комментарий - Если вы используете SQL Server 2012 или более поздней версии вы можете использовать LEAD/LAG функции, что-то вроде:

SELECT Dates, 
     PreviousDate = LAG(Dates) OVER (ORDER BY Dates), 
     NextDate = LEAD(Dates) OVER (ORDER BY Dates) 
FROM @DateTable; 

Если вы используете более ранние версии вам нужно будет использовать APPLY :

SELECT Dates, 
     PreviousDate = prev.Dates 
FROM @DateTable AS dt 
     OUTER APPLY 
     ( SELECT TOP 1 Dates 
      FROM @DateTable AS Prev 
      WHERE Prev.Dates < dt.Dates 
      ORDER BY Dates DESC 
     ) AS prev; 
+0

Я бы сказал, что вы правы, но я не могу изменить getVal(). Бонусные баллы, если вы знаете, как сделать getVal (Даты, даты-1), как в дату, так и в предыдущую дату внутри этой таблицы. Но это разъясняет, как я могу обойти петли, что было моей главной проблемой. Принято. – aperture

Смежные вопросы