2011-12-21 76 views
1

目前我必須要改變視圖,視圖代碼的很大一部分是這樣的:避免代碼複製的最佳做法?

CAST('My_Tag_' + CASE 
     WHEN FieldX isnull 
      THEN '' 
     WHEN FieldX = '123' 
      THEN 'some_number' 
     WHEN FieldX = 'abc' 
      THEN 'some_text' 
     ELSE 'strange') AS VARCHAR(128) AS myField 
) 

只是一個代碼塊,即拼字符串(代碼本身甚至沒有事,現在,我有50個其他例子,我有很多代碼複製)。現在我在視圖中有30個更多字段的完全相同的代碼,只是'My_Tag_'和FieldX正在改變。如果這將是C#,我只會寫一個輔助函數。 當然,我也可以在這裏寫一個函數。但由於這是一個更大的項目,有很多表格,視圖等,我很快就會有數百個功能。

現在我對SQL很陌生,通常我的家就是OOP世界。但是必須有一個解決方案來避免代碼複製,並避免在數據庫中有數百個輔助函數?

在這種情況下最佳做法是什麼?

+0

嘗試使用標量值功能..並把代碼在其中返回VARCHAR(128) – 2011-12-21 09:25:34

回答

2

最佳做法可能是創建一個user defined function

參數將是更改的字段,它將返回預期的值。

+0

但是,如果每個開發人員都將他的小幫手功能添加到數據庫中,我們將在半年內輕鬆實現1000個功能。仍然是最好的方式? – Feroc 2011-12-21 10:06:24

+0

我的理解是輔助函數是相似的,只有「My_Tag_」和「FieldX」在改變。所以你可以把它們作爲函數的輸入參數。 – 2011-12-21 10:10:39

+0

是的,對於這種情況。但是對於這個數據庫,還有50個其他完全不同的視圖,在這些視圖中,每個視圖需要5個不同的輔助函數以避免代碼重複。我們會有更簡潔的代碼,但我們會有數百個幫助函數。 – Feroc 2011-12-21 10:18:07

1

您可以使用CTE將字段添加到表:

; with TableWithExtraField as 
     (
     select case ... end as NewField 
     ,  table1 
     ) 
select NewField 
from  TableWithExtraField 

或子查詢也可以工作:

select NewField 
from (
     select case ... end as NewField 
     ,  table1 
     ) as TableWithExtraField 
1
CREATE FUNCTION dbo.MyTag(@myfield VARCHAR(MAX)) 
RETURNS VARCHAR(128) 
AS 
BEGIN 
    RETURN CAST('My_Tag_' + CASE 
     WHEN @myfield IS NULL 
      THEN '' 
     WHEN @myfield = '123' 
      THEN 'some_number' 
     WHEN @myfield = 'abc' 
      THEN 'some_text' 
     ELSE 'strange' END AS VARCHAR(128)) 
) 
END