Sql 更新视图时,在基础表中插入其他值

Sql 更新视图时,在基础表中插入其他值,sql,sql-server,sql-server-2012,views,Sql,Sql Server,Sql Server 2012,Views,考虑以下示例,其中我有一个表和相应的视图: 表|视图 T|u EmailAddress | V|u EmailAddress ----------------+---------------- ID INT | ID 状态VARCHAR |状态 有效整数| 第1列VARCHAR |第1列 ColumnN VARCHAR | ColumnN 我有一个程序发出以下查询: UPDATE V_EmailAddress SET Status = 'valid' WHERE ID = 1; UPDAT

考虑以下示例,其中我有一个表和相应的视图:

表|视图
T|u EmailAddress | V|u EmailAddress
----------------+----------------
ID INT | ID
状态VARCHAR |状态
有效整数|
第1列VARCHAR |第1列
ColumnN VARCHAR | ColumnN
我有一个程序发出以下查询:

UPDATE V_EmailAddress SET Status = 'valid'   WHERE ID = 1;
UPDATE V_EmailAddress SET Status = 'invalid' WHERE ID = 2;
是否可以更新基础表,以便将状态
有效
无效
存储为基础表的有效列中的
1
0


请注意,我无法更改表或查询。但是,我可以向表中添加“普通”列。

您可以添加
更新触发器:

CREATE TRIGGER T_Valid ON T_EmailAddress
INSTEAD OF UPDATE
AS
BEGIN

    UPDATE t
    SET ID = i.ID
        ,Valid = CASE WHEN i.Status = 'Valid' THEN 1 ELSE 0 END
        ,Status = i.Status
        ,Column1 = i.Column1
        ,ColumnN = i.ColumnN
    FROM T_EmailAddress t
        INNER JOIN ON INSERTED i
            ON t.ID = i.ID

END
GO
或者,您可能希望用计算列替换
Valid
列:

ALTER TABLE T_EmailAddress
DROP COLUMN Valid

ALTER TABLE T_EmailAddress
ADD Valid AS (CASE WHEN Status = 'Valid' THEN 1 ELSE 0 END) PERSISTED

您可以在视图上使用INSTEADOFUPDATE触发器。 当视图上的update语句完成时,触发器将触发。请注意,而不是触发器意味着更新将被阻止,您必须自己将update语句写入下划线表

沿着这些思路应该可以做到这一点:

CREATE TRIGGER V_EmailAddress_IO_Update ON V_EmailAddress
INSTEAD OF UPDATE
AS
BEGIN

UPDATE t
SET Column1 = i.Column1,
    ColumnN = i.ColumnN,
    Valid = CASE WHEN i.[Status] = 'valid' THEN 1 ELSE 0 END

FROM inserted i 
INNER JOIN T_EmailAddress t ON i.ID = t.ID

END

请注意,必须在update语句中包含视图中可以更新的所有列,否则这些列将不会更新。

r您正在查找其他更新查询,若要将valid转换为1,将invalid转换为0?能否提供视图定义?@Tanner视图只是主表中列的子集,但它有一个WHERE子句。因此状态是valid的别名?为什么不在视图上使用instead of update触发器?我是否需要在视图中包含id列?您已经在问题中包含了它。。。但是,是的,视图必须包含行标识符(不必是单个列,任何具有唯一索引的内容都可以)