SQL Server视图中使用*将可能带来一定的隐患

请添加图片描述

事件背景

大中午的室友就开始吐槽他接到的别人的项目了,说视图里面写*,导致出现了一系列的问题,本来我还没太在意,想着只不过是查询了所有的数据,这比起我接到的那位视图套视图的项目还是没那么离谱的,可突然有人冒出来了一句如果你a表 和b表 存在同一个字段 可能会报错哟,这就勾起了我的兴趣,如果*的那张表加字段了,视图会发生什么,于是我们就进行了探讨,结果操作下来,发现,确实会有影响,而且影响还不小,最有意思的是,我突然想起来,我接手的别人的项目中,别人也有这种写法,真的是吃瓜吃到自己身上了

事件演示
--首先创建一个带*的视图
CREATE VIEW [dbo].[View_DoctorInfoListS]
AS
SELECT   a.*,b.Province,b.Name AS bNAME
FROM      dbo.DoctorInfo AS a INNER JOIN
                dbo.Hospital AS b ON a.HospitalID = b.ID
GO
--查询该视图
SELECT * FROM View_DoctorInfoListS

请添加图片描述
我们可以发现b表是有数据的,同时a表的数据也是正常的

--给DoctorInfo增加一个字段

--再次查询该视图
SELECT * FROM View_DoctorInfoListS

请添加图片描述
请添加图片描述
此时我们发现a表增加一个字段后,字段没有增加到视图,然后我们还发现b表的数据往后挪走了一个字段,这里我们可以得出结论,当a表加一个字段后,视图不会添加此字段(视图里面*的字段的数量会以你最新运行修改视图时,a表的字段数量为准),但是会将a表查到的值赋值给同等的b表的第一个字段,b表第一个字段的值赋值给了b表第二个字段,依次往后挪动,而且如果a表加的字段为Province,也就是视图会存在两个相同的字段,这时候,你去修改视图的时候会报错,如果同名字段只是查询的话是允许的
那其实造成的风险还是蛮大的,如果后面的字段类型跟实体刚好对上了的话,就极有可能出现整个b表的数据都对不上的问题

同名查询被运行

由此我们扩散出一个问题

如果视图只查了单表,但是用分组排序,或者加了一个扩展字段,此时a表加字段会发生什么呢,是否会跟上述结果一样呢?

CREATE VIEW [dbo].[View_DoctorInfoListC]
AS
SELECT   a.*,'测试组' AS Counts
FROM      dbo.DoctorInfo AS a 
GO
--查询该视图
SELECT TOP 10 * FROM View_DoctorInfoListC
--给DoctorInfo增加一个字段

--再次查询该视图
SELECT TOP 10 * FROM View_DoctorInfoListC

请添加图片描述
请添加图片描述

请添加图片描述
由此可见,结果还是一样的
至于为什么在视图中不能有同名的,是因为视图毕竟是当做一张表来用,表的字段名肯定不能有重复的
对于经常喜欢在视图中写*的朋友,还是需要注意一下,在这里也主要是提醒自己,保持不要写

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值