有什么方法可以在SQL中创建函数/方法来组合SELECT中的列?

时间:2018-11-14 15:20:03

标签: sql-server sql-server-2008

在SQL中编写了一个非常简单的函数,显然在我的SELECT语句中不可用(或不可取)。

在我们选择的“公司名称和联系人姓名组合”组合背后具有一些智能,我发现它在多个视图中都在重复。作为一名程序员,当然正确的是封装该功能,以便在我创建的所有视图中重用。但是,a,从我的搜索来看,它似乎是不可能或不推荐的,至少对于UDF来说不是。

问题:有什么方法可以选择方法/函数/可重用代码块的返回值,我可以在其中将每行的列值传递给它... 还是我真正地必须将逻辑复制/粘贴到每个选择语句中?

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

我知道我可以(最终)在客户端上执行此操作,但是客户端更改不在项目此阶段的范围内。

我想我在这个问题上键入的内容不仅仅是将CASE语句剪切并粘贴到每个视图中,但是如果我愿意的话,重用根深蒂固。 :)

2 个答案:

答案 0 :(得分:1)

computed column是实现此目的的一种性能更好的DRY方法。

  

计算列是未物理存储在其中的虚拟列   表格,除非该列标记为“ PERSISTED”。计算列   表达式可以使用其他列中的数据来计算   它所属的列。您可以为   使用SQL Server管理在SQL Server 2017中计算列   Studio或Transact-SQL。

您可以制作此column persisted as well

  

PERSISTED指定数据库引擎将物理存储   计算表中的值,并在其他任何时候更新值   计算列所依赖的列将更新。标记一个   作为PERSISTED的计算列允许在索引上创建索引   确定性但不精确的计算列。欲了解更多   信息,请参阅计算列索引。任何计算列   必须明确用作分区表的分区列   标记为“ PERSISTED”。 compute_column_expression必须是确定性的   当指定PERSISTED时。

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

然后,您可以将其添加到SELECT中,如果该列仍然存在,甚至可以对其进行查询。

答案 1 :(得分:1)

您可以做的是创建一个行为类似于表的视图。这意味着它将具有表的性能,可以添加索引等。该视图可以具有基础基表的任何列,还可以添加计算出的列,例如[name]。这是通过在创建视图时添加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 

现在可以在使用表的所有位置使用此视图,而不会影响性能。此外,计算出的列[Name]实际上可以添加一个索引!那是您无法使用函数执行的操作。