Лучшая практика, чтобы избежать репликации кода? - PullRequest
1 голос
/ 21 декабря 2011

В настоящее время я должен изменить представление, большая часть кода представления выглядит следующим образом:

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, и обычно мой дом - это мир ООП.Но должно быть решение, позволяющее избежать репликации кода и избежать наличия сотен вспомогательных функций в базе данных?

Какова наилучшая практика в этом случае?

Ответы [ 3 ]

2 голосов
/ 21 декабря 2011

Лучшей практикой может быть создание определяемой пользователем функции .

Аргументами будут изменяемые поля, которые будут возвращать предполагаемое значение.

1 голос
/ 21 декабря 2011
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
1 голос
/ 21 декабря 2011

Вы можете использовать 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
...