1

我正在设置一个视图 (foo) 来代替同名的表。新视图将使用 3 个子表(A、B、C)而不是原始表。我正在使用而不是触发器来完成此操作。

CREATE VIEW [dbo].[foo]
AS
select
    b2 as oldkey,
    b3 as boat,
    c2 as state,
    a2 as name
from
    A
    join B on a1 = b1
    join C on a1 = c1

foo 列:oldkey(身份)| 船| 高分辨率照片| CLIPARTO 状态 | 姓名

我的问题是我有一个大型代码库,它被写入 foo ,如下所示:

insert into foo
values
('fishing boat', 'California', 'Skipper')

但是此代码当前无法正常工作,因为 insert-of-insert/view 也希望提供键值。键值是表 B 上的标识,所以我不需要插入它。

错误:“列名或提供的值的数量与表定义不匹配。”

我需要进行哪些更改以允许已经存在的插入代码库继续运行?

4

1 回答 1

2

由于INSERT没有指定预期的列,而是使用了隐式的标识列跳过技巧,我认为你只是不走运。

这是一个很好的例子,说明为什么指定列名是最佳实践。如果原始代码指定了这样的列名:

INSERT INTO dbo.Foo (ItemType, Location, Name)
VALUES ('fishing boat', 'California', 'Skipper');

然后插入将起作用(通过以下修改)。

在视图中指定列时INSERT,您可以通过修改视图来跳过identity列,以便该列不再保留identity视图元数据中的属性或 PK 状态。你可以这样做:

SELECT
   IdentityColumn = IdentityColumn * 1, -- a math expression removes `identity`
   OtherColumns
FROM
   TablesHere
;
于 2013-07-08T17:14:49.510 回答