2014-12-04 33 views
0

我試圖設計一個函數來替換許多存儲過程中常用邏輯的大案例語句。分組中的內聯UDF通過SQL

基於我的研究,我將它設置爲內聯表值函數。

我的問題是:我將要替換的很多存儲過程都使用分組依據,但我似乎無法將內聯函數分組,如同我可以標量一樣。你如何通過內聯函數進行分組?我想,我試圖做到這一點:

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 APPLYOUTER 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 

更多示例與APPLYhttp://www.mssqltips.com/sqlservertip/1958/sql-server-cross-apply-and-outer-apply/

+0

這很好,謝謝。我還沒有使用APPLY函數。這似乎是進行這些更改的最乾淨的方式。偉大的文章也是如此。 – 2014-12-04 20:05:09

0

如果它只是由骨料和A組子查詢應該工作扔了:

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

謝謝你的迴應。我試圖不改變代碼的結構,因爲有太多需要更新。這可能是不可能的,我將不得不堅持標量版本,我想確保我不會錯過使用內聯的明顯事物。 – 2014-12-04 19:04:21