• 主页
  • 基础类
  • 应用实例
  • 新技术前沿

sql server2008 联机丛书疑问

iqlife 盈盈杭州 架构师  2014-10-16 11:47:41
今天看到联机丛书的instead of 触发器相关章节,对其中的示例有点疑问,测试了下果然是有出入,求解释:
测试如下:

select @@version

Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64)
Apr 2 2010 15:48:46
Copyright (c) Microsoft Corporation
Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)

--测试表建立
CREATE TABLE BaseTable
(PrimaryKey int PRIMARY KEY IDENTITY(1,1),
Color nvarchar(10) NOT NULL,
Material nvarchar(10) NOT NULL,
ComputedCol AS (Color + Material)
)
GO

--Create a view that contains all columns from the base table.
CREATE VIEW InsteadView
AS SELECT PrimaryKey, Color, Material, ComputedCol
FROM BaseTable
GO

--Create an INSTEAD OF INSERT trigger on the view.
CREATE TRIGGER InsteadTrigger on InsteadView
INSTEAD OF INSERT
AS
BEGIN
--Build an INSERT statement ignoring inserted.PrimaryKey and
--inserted.ComputedCol.
INSERT INTO BaseTable
SELECT Color, Material
FROM inserted
END
GO



插入数据测试
--直接引用 BaseTable 的 INSERT 语句无法为 PrimaryKey 列和 ComputedCol 列提供值。例如:
--A correct INSERT statement that skips the PrimaryKey and ComputedCol columns.
INSERT INTO BaseTable (Color, Material)
VALUES (N'Red', N'Cloth')

--View the results of the INSERT statement.
SELECT PrimaryKey, Color, Material, ComputedCol
FROM BaseTable

PrimaryKey Color Material ComputedCol
1 Red Cloth RedCloth

--下面语句返回错误,无法为计算列提供值,报错
--An incorrect statement that tries to supply a value for the
--PrimaryKey and ComputedCol columns.
INSERT INTO BaseTable(Color, Material,ComputedCol)
VALUES ( N'Green', N'Wood', N'GreenWood')

>[Error] Script lines: 40-42 ------------------------
不能修改列 "ComputedCol",因为它是计算列,或者是 UNION 运算符的结果。
Msg: 271, Level: 16, State: 1, Procedure: , Line: 1




官方文档里提到下面的测试不对:

但是,引用 InsteadView 的 INSERT 语句必须为 PrimaryKey 列和 ComputedCol 列提供值:


--A correct INSERT statement supplying dummy values for the
--PrimaryKey and ComputedCol columns.
INSERT INTO InsteadView (PrimaryKey, Color, Material, ComputedCol)
VALUES (999, N'Blue', N'Plastic', N'XXXXXX')
--View the results of the INSERT statement.
SELECT PrimaryKey, Color, Material, ComputedCol
FROM InsteadView


传递到 InsteadTrigger 的所插入表是由不可为空值的 PrimaryKey 列和 ComputedCol 列生成的,因此引用该视图的 INSERT 语句必须为那些列提供值。值 999 和 N'XXXXXX' 将传递到 InsteadTrigger,但是触发器中的 INSERT 语句未选择 inserted.PrimaryKey 或 inserted.ComputedCol;因此,将忽略这两个值。实际插入到 BaseTable 的行在 PrimaryKey 中的值为 2,在 ComputedCol 中的值为 N'BluePlastic'。


但是实际结果是测试通过的,无需指定 PrimaryKey 列和 ComputedCol 列,如下:
--下面没有提供值,报错
INSERT INTO InsteadView (Color, Material)
VALUES (N'Yellow', N'Video')

SELECT PrimaryKey, Color, Material, ComputedCol
FROM InsteadView

PrimaryKey Color Material ComputedCol
1 Red Cloth RedCloth
2 Blue Plastic BluePlastic
3 Yellow Video YellowVideo
...全文
142 点赞 收藏 8
写回复
8 条回复
卖水果的net 版主 2014年10月20日
我刚才看了官网的说明,我猜想,可能这个说明是前期版本的,后续有改动,没有调整。 英文的那个页而没看明白。
回复 点赞
还在加载中灬 2014年10月20日
常见的有自增、默认值、计算列吧~~
回复 点赞
iqlife 2014年10月20日
明白了,如果写了字段就必须给字段写上值,,这个是基本常识吧。。。还有什么sql支持写字段不写值能插入的? 看来是自己自作多情了。。。。
回复 点赞
iqlife 2014年10月16日
补充:以为官方文档说的是插入NULL值,所以又测试了下,结果如下:
INSERT INTO InsteadView (PRIMARYKEY,Color, Material,COMPUTEDCOL)
       VALUES (null,N'Yellow', N'Card',null)

SELECT PrimaryKey, Color, Material, ComputedCol
FROM InsteadView
PrimaryKey Color Material ComputedCol 1 Red Cloth RedCloth 2 Blue Plastic BluePlastic 3 Yellow Video YellowVideo 4 Yellow Card YellowCard 看来不是这个意思
回复 点赞
还在加载中灬 2014年10月16日
引用 4 楼 OrchidCat 的回复:
翻译理解的问题。 英文原文http://technet.microsoft.com/en-us/library/ms175089(v=sql.105).aspx 中文翻译后 http://technet.microsoft.com/zh-cn/library/ms175089(v=sql.105).aspx 实际上,因为INSERT INTO InsteadView (PrimaryKey, Color, Material, ComputedCol) 采用了列名写全了的方式 下面的value里面,必须对应字段,给出值,即便是null。 就是一个语法处理要求,并非是trigger的某个限定。
哦,是这样啊,但是对于一些,自增或默认值等,不赋值,好像也不报错 只是这样的写法不规范吗?
回复 点赞
Mr_Nice 2014年10月16日
翻译理解的问题。 英文原文http://technet.microsoft.com/en-us/library/ms175089(v=sql.105).aspx 中文翻译后 http://technet.microsoft.com/zh-cn/library/ms175089(v=sql.105).aspx 实际上,因为INSERT INTO InsteadView (PrimaryKey, Color, Material, ComputedCol) 采用了列名写全了的方式 下面的value里面,必须对应字段,给出值,即便是null。 就是一个语法处理要求,并非是trigger的某个限定。
回复 点赞
iqlife 2014年10月16日
引用 2 楼 ky_min 的回复:
会不会译者理解错了~~ 或是微软自己翻译错了~~ 从上面测试看,确实和描述不符 但是,插入一个表确实应该为一个不可为空又无默认值约束或不是计算列的列赋值 在一个由单表创建的视图,满足约束条件就可以插入数据。 以你上面的情况来看,这时的约束和那个表的约束是一样的,怎么会说 必须为 PrimaryKey 列和 ComputedCol 列提供值呢? 要不,你再看看英文的,有些东西,看英文最标准了~~
如果是翻译错了倒是无所谓,怕就怕有什么地方理解错了
回复 点赞
还在加载中灬 2014年10月16日
会不会译者理解错了~~ 或是微软自己翻译错了~~ 从上面测试看,确实和描述不符 但是,插入一个表确实应该为一个不可为空又无默认值约束或不是计算列的列赋值 在一个由单表创建的视图,满足约束条件就可以插入数据。 以你上面的情况来看,这时的约束和那个表的约束是一样的,怎么会说 必须为 PrimaryKey 列和 ComputedCol 列提供值呢? 要不,你再看看英文的,有些东西,看英文最标准了~~
回复 点赞
发动态
发帖子
MS-SQL Server
创建于2007-09-28

1.4w+

社区成员

25.3w+

社区内容

MS-SQL Server相关内容讨论专区
社区公告
暂无公告