sql-server - 如何插入默认值作为 SQL Server View 定义的一部分?

标签 sql-server sql-server-2008 sql-server-2008-r2

我有许多不同的 View ,它们使用相同的基础表,但每个 View 都使用不同的 FK 默认值。

对于我尝试的代码:

ALTER VIEW [dbo].[vwTest]
 AS
SELECT     
Id, 
C1 AS |TestCol, 
COALESCE(GroupId,3) AS GroupId 
FROM         dbo.tblTest
WHERE     (GroupId = 3)

我知道“3”是硬编码的,但会被替换。

我认为这是造成麻烦的行:

COALESCE(GroupId,3) AS GroupId 

每次将记录插入 vwTest 时,我都需要将“3”插入到 tblTest.GroupId 中。

谢谢。

最佳答案

在 View 上创建替代触发器

SQL fiddle

示例表/ View

create table tblTest( id int identity, c1 varchar(10), groupid int );

create view vwtest as select c1, COALESCE(GroupId,3) GroupId 
from tblTest
where GroupID = 3;

创建触发器

CREATE TRIGGER InsteadTrigger on vwTest
INSTEAD OF INSERT
AS
BEGIN
  INSERT INTO tblTest (c1, GroupID)
       SELECT c1, 3
       FROM inserted
END;

将一些测试数据放入表/ View

insert into tblTest( c1, groupid ) select 'row 1' ,3 ;
insert into tblTest( c1, groupid ) select 'row 2' ,1 ;
insert into vwTest(c1) select 'row 3';

看看我们得到了什么

select * from tblTest;
select * from vwTest;

关于sql-server - 如何插入默认值作为 SQL Server View 定义的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16202752/

相关文章:

sql - 在 SQL Server 中存储日期值的货币数据类型?

sql-server - 使用 Delphi 和 dbExpress 连接到 SQL Server

sql - 如果 SQL 中存在语句超时

sql - 获取时隙列(SQL 查询)

c# - 消息6522,在执行clr存储过程期间发出16级警告

SQL Server Management Studio ZEROFILL

java - 如何在spring中使用SimpleJDBCCall获取存储过程的多表结果?

SQL查找子行相对于顶部父行的深度

SQL:从表中获取最新的(未)订阅操作

sql - 使用分隔符连接多个字段