Любой способ создать функцию / метод в SQL для объединения столбцов в SELECT? - PullRequest
0 голосов
/ 14 ноября 2018

Написал замечательную простую функцию в SQL, которая, по-видимому, не пригодна для использования (или не рекомендуется) в моем операторе SELECT.

Имею некоторый интеллект для объединения комбинаций названия компании и имени контакта в нашей выборке, и я считаю, что она повторяетсячерез несколько просмотров.Будучи программистом, конечно, правильная вещь заключается в том, чтобы инкапсулировать эту функциональность для повторного использования во всех созданных мной представлениях.Но, увы, из моего поиска это не представляется возможным или рекомендуемым, по крайней мере, не с UDF.

Вопрос: Есть ли способ выбрать возвращаемое значение метода / функции / чанка многоразового использованиякод, в котором я передаю ему значение столбцов для каждой строки ... Или мне действительно нужно копировать / вставлять логику в каждое выражение выбора?

SELECT formatName(company, contact, ' - ') as Name FROM company join contacts...

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

Я думаю, я набрал больше этого вопроса, чем просто вырезание и вставка оператора CASE в каждое представление, ноповторное использование укоренилось, если я, конечно.:)

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Что вы можете сделать, это создать представление, которое ведет себя как таблица.Это означает, что он будет иметь производительность таблицы, может иметь добавленные индексы и т. Д. В этом представлении могут быть любые столбцы базовой таблицы, плюс вы можете добавить вычисляемые столбцы, например [имя].Это достигается путем добавления WITH SCHEMABINDING при создании представления.Затем это представление можно использовать вместо базовой таблицы во всех ваших запросах.

Вот пример.Базовая базовая таблица с данными:

CREATE TABLE dbo.company (
    companyid int IDENTITY(1,1) NOT NULL,
    company varchar(50) NULL,
    contact varchar(50) NULL,
 CONSTRAINT PK_company PRIMARY KEY CLUSTERED  (companyid ASC) 
) ON FG1

Представление, содержащее WITH SCHEMABINDING:

CREATE view dbo.VW_company WITH SCHEMABINDING AS 
SELECT companyid, 
CASE WHEN RTRIM(ISNULL(company,'')) <> '' AND RTRIM(ISNULL(contact,'')) <> '' THEN company +' - '+ contact
    WHEN RTRIM(ISNULL(company,'')) <> '' THEN company
    WHEN RTRIM(ISNULL(contact,'')) <> '' THEN contact
    ELSE '' END as [Name]
FROM dbo.company 

Это представление теперь можно использовать везде, где используется таблица, без снижения производительности.Кроме того, в вычисляемый столбец [Имя] может быть добавлен индекс!Это то, что вы не можете сделать с функцией.

0 голосов
/ 14 ноября 2018

Более эффективный и СУХОЙ метод для этого - вычисляемый столбец .

Вычисляемый столбец - это виртуальный столбец, который физически не хранится в таблица, если столбец не помечен как PERSISTED. Вычисляемый столбец выражение может использовать данные из других столбцов, чтобы вычислить значение для столбец, к которому он принадлежит. Вы можете указать выражение для вычисляемый столбец в SQL Server 2017 с помощью SQL Server Management Studio или Transact-SQL.

Вы можете также сохранить этот столбец

PERSISTED Указывает, что компонент Database Engine будет физически хранить вычисленные значения в таблице, и обновите значения, когда любой другой столбцы, от которых зависит вычисляемый столбец, обновляются. Маркировка вычисляемый столбец как PERSISTED позволяет создать индекс на вычисляемый столбец, который является детерминированным, но не точным. Для большего информацию смотрите в разделе Индексы на вычисляемых столбцах. Любые вычисляемые столбцы используется в качестве столбцов разбиения разделенной таблицы должно быть явно помечен PERSISTED. computed_column_expression должно быть детерминированным когда указано PERSISTED.

alter table company add FullName as (FirstName + '-' + LastName) persisted;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...