2014-12-04 5 views
0

Я пытаюсь создать функцию для замены большого аргумента case из часто используемой логики во многих хранимых процедурах.Inline UDF в группе по SQL

Основываясь на моих исследованиях, я настроил его как функцию, ориентированную на таблицу Inline.

Мой вопрос: Многие из хранимых процедур, которые я буду заменять, используют Group By, но я не могу сгруппировать по встроенной функции, как я могу скаляр. Как вы группируетесь по встроенной функции? Я думаю, что я пытаюсь сделать это:

SELECT account 
,  (SELECT Inline FROM fnGroups (id)) AS Buckets 
,  SUM(Sales) AS Sales 
FROM FactTable 
GROUP BY 
     Account 
,  (SELECT Inline FROM fnGroups (id)) --Not Allowed 

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

Спасибо!

ответ

1

Мне кажется, что CROSS APPLY или OUTER APPLY должен делать эту работу:

SELECT f.account 
,  a.Inline 
,  SUM(f.Sales) AS Sales 
FROM FactTable f 
OUTER APPLY fnGroups(f.id) a 
GROUP BY 
     f.Account 
     a.Inline 

Больше примеров с APPLY: http://www.mssqltips.com/sqlservertip/1958/sql-server-cross-apply-and-outer-apply/

+0

Это отлично работает, спасибо. Я еще не использовал функцию APPLY. Кажется, это самый чистый способ внести эти изменения. Отличная статья. –

0

подзапрос должен работать, если это просто совокупность и группа с тем, что бросает:

SELECT account, 
,  Buckets 
,  SUM(Sales) AS Sales 
FROM (
    SELECT account 
    ,  Sales 
    ,  (SELECT Inline FROM fnGroups (id)) AS Buckets 
    FROM FactTable) F 
GROUP BY 
     Account 
,  Buckets 
+0

Благодарим за отзыв. Я стараюсь не изменять структуру кода, так как есть так много, что требуется обновление. Это может быть невозможно, и мне придется придерживаться скалярной версии, я хотел убедиться, что я не пропущу что-то очевидное в использовании встроенного. –