不允许在另一个计算列定义中使用计算列

时间:2017-02-21 03:18:19

标签: sql-server tsql

我得到计算列不允许在另一个计算列中使用  我试图在另一个计算字段中使用计算字段时定义错误消息。有没有解决办法来实现这个目标?

Computed field1

ALTER TABLE DBO.[ASSy] ADD [CALC STOCK NO] AS (

CASE 
WHEN isnull([DIRECTIONAL TREAD],'') ='YES RIGHT' THEN isnull([STOCK NO],'')+'R'
WHEN isnull([DIRECTIONAL TREAD],'') ='YES LEFT' THEN isnull([STOCK NO],'')+'L'
ELSE isnull([STOCK NO],'')
end 
)

下面是第二个计算字段。当我执行脚本时,我得到了

  

Msg 1759,Level 16,State 0,Line 5 Computed column' CALC STOCK NO'在   表' ASSy'不允许在另一个人中使用   计算列定义。

ALTER TABLE dbo.[ASSy] ADD [PN & DESCRIPTION] AS (ISNULL([CALC STOCK NO],'')+ ', '+ISNULL([TIRE SIZE],'')+', '+ ISNULL([BH SPEC],''))

2 个答案:

答案 0 :(得分:2)

不允许。

变通方法是在另一列的定义中重复整个代码,或者将共享代码封装在标量UDF中,或者将逻辑拉到视图中(如果它不是持久的,通常就足够了)用于编制索引的列)

答案 1 :(得分:1)

根据Computed Columns文档:

  

计算列是根据可以使用其他的表达式计算的   同一个表中的列。 表达式可以是非计算列   名称,常量,函数以及这些连接的任意组合   一个或多个运算符。表达式不能是子查询。

计算列不能引用另一个计算列。您有以下选择:

  1. 创建第二个计算列,其中包含与第一个计算列相同的逻辑(无法引用)。
  2. 将第一个计算列替换为普通列:
  3. ALTER TABLE DBO.[ASSy] DROP COLUMN [CALC STOCK NO]
    ALTER TABLE ADD [CALC STOCK NO] VARCHAR(100) NULL
    UPDATE TABLE t
        SET [CALC STOCK NO] = 
            CASE 
            WHEN isnull([DIRECTIONAL TREAD],'') ='YES RIGHT' THEN isnull([STOCK NO],'')+'R'
            WHEN isnull([DIRECTIONAL TREAD],'') ='YES LEFT' THEN isnull([STOCK NO],'')+'L'
            ELSE isnull([STOCK NO],'')
            END
    FROM [CALC STOCK NO] t
    
    1. 在表格顶部创建VIEW并在其中实施第二列:
    2. CREATE VIEW DBO.[vASSy]
      AS
      SELECT   t.*
              ,[PN & DESCRIPTION] = (ISNULL([CALC STOCK NO],'')+ ', '+ISNULL([TIRE SIZE],'')+', '+ ISNULL([BH SPEC],''))
      FROM DBO.[ASSy] t