如何使用 Alter Table 从外部表创建派生属性? - SQL Server

问题描述 投票:0回答:1

这次我无法在 CREATE TABLE 命令中创建派生列。我尝试使用 Alter Table 但发现以下错误:

“在此上下文中不允许子查询。仅允许标量表达式。”

我的数据库:

CREATE TABLE Bem (
   ID INT PRIMARY KEY IDENTITY(1,1),
   PRECO INT,
   NOME VARCHAR(128),
   CATEGORIA VARCHAR(128)
);
 

CREATE TABLE Orcamento (
   ID INT PRIMARY KEY IDENTITY(1,1),
   Nome VARCHAR(128),
   Valor INT
);

CREATE TABLE Inventario (
  ID_Bem INT FOREIGN KEY REFERENCES Bem(ID),
  ID_Orc INT FOREIGN KEY REFERENCES Orcamento(ID),
  PRIMARY KEY (ID_Bem,ID_Orc)
);

我希望 Orcamento(Valor) 成为派生列,即 Inventorio 表中找到的与 Orcamento ID 匹配的每个项目的 Bem(Preco) 总和。

这就是我尝试过的:

ALTER TABLE Orcamento
  ADD ValorT
     AS
     (SELECT SUM(Bem.Preco)
         FROM Bem, Inventario
         WHERE Bem.ID = Inventario.ID_Bem 
            AND Inventario.ID_Orc = Orcamento.ID
     )
;

使用 UPDATE 有效,但每次我向 Inventario 表添加数据时都必须运行此 UPDATE。我想知道更好的选择

ssms
1个回答
0
投票

每次想要更新列时手动运行它可能会很困难。创建一个标量 UDF 来填充它是有意义的,如下所示:

标量 UDF

CREATE FUNCTION dbo.GetOrcamentoValor (@OrcamentoID INT)  
RETURNS INT  
AS  
BEGIN  
DECLARE @Valor INT;  
SELECT @Valor = SUM(Bem.Preco)  
FROM Bem  
JOIN Inventario ON Bem.ID = Inventario.ID_Bem  
WHERE Inventario.ID_Orc = @OrcamentoID;  
RETURN ISNULL(@Valor, 0);  
END;  

此后,更改 Orcamento 表以使用 UDF 添加计算列:

ALTER TABLE Orcamento  
ADD Valor AS dbo.GetOrcamentoValor(ID);

每当您在 Orcamento 表中插入或更新一行时,都会使用标量 UDF 中定义的逻辑自动计算 Valor 列。

© www.soinside.com 2019 - 2024. All rights reserved.