2011-12-21 99 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