如何在SQL Server中设置简单的计算字段?

Jos*_*ons 14 sql sql-server-2005 calculated-field

我有一个包含多个帐户字段的表格,如下所示:

MAIN_ACCT
GROUP_ACCT
SUB_ACCT
Run Code Online (Sandbox Code Playgroud)

我经常需要像这样组合它们:

SELECT MAIN_ACCT+'-'+GROUP_ACCT+'-'+SUB_ACCT
FROM ACCOUNT_TABLE
Run Code Online (Sandbox Code Playgroud)

我想要一个自动执行此操作的计算字段,所以我可以说:

SELECT ACCT_NUMBER FROM ACCOUNT_TABLE
Run Code Online (Sandbox Code Playgroud)

做这个的最好方式是什么?

我正在使用SQL Server 2005.

HLG*_*GEM 26

ALTER TABLE ACCOUNT_TABLE 
ADD ACCT_NUMBER AS MAIN_ACCT+'-'+GROUP_ACCT+'-'+SUB_ACCT PERSISTED
Run Code Online (Sandbox Code Playgroud)

如果你有大量的记录,那么这将保留一个计算列并且在选择中可能比在视图或UDF中的计算更好(一旦发生了列的初始创建,这可能会非常缓慢并且应该在低使用时间期间发生).它会减慢插入和更新的速度.通常我发现用户可以比使用select中的延迟更好地容忍慢插入或更新,除非您遇到锁定问题.

这样做的最佳方法将取决于您的使用情况以及您需要的性能.如果您没有很多记录,或者如果不经常调用计算列,您可能不需要持久列,但如果您经常运行包含年度所有记录或其他大型集合的报表数据,您可能会发现持久计算列更适合您.与任何这种性质的任务一样,了解在您的情况下哪种方法最有效的唯一方法是进行测试.


p.c*_*ell 8

这是View的一个很好的候选者.

CREATE VIEW vwACCOUNT_TABLE
AS

SELECT MAIN_ACCT+'-'+GROUP_ACCT+'-'+SUB_ACCT AS ACCT_NUMBER 
FROM ACCOUNT_TABLE

GO

--now select from the View
SELECT ACCT_NUMBER FROM  vwACCOUNT_TABLE
Run Code Online (Sandbox Code Playgroud)


Rem*_*anu 5

ALTER TABLE ACCOUNT_TABLE ADD ACCT_NUMBER AS MAIN_ACCT+'-'+GROUP_ACCT+'-'+SUB_ACCT;
Run Code Online (Sandbox Code Playgroud)

该列未持久存储在表中,每次引用时都会在on-cly上重新创建.您可以使用视图获得相同的结果.如果您对计算列使用过滤谓词或排序,并希望在其上添加索引,请参阅在计算列上创建索引.

  • 你可以坚持专栏而不是花时间重新计算你在视图中必须做的事情.我们坚持我们的原因是因为每当我们想要查询信息时,数据更改时的轻微延迟远远好于长延迟.如果持久化,您还可以索引列 (2认同)