SQL Server 中视图用*可能会造成的问题

USE tempdb
GO
IF OBJECT_ID('view_stu') IS NOT NULL
DROP VIEW view_stu
GO
IF OBJECT_ID('stu') IS NOT NULL
DROP TABLE stu
GO
CREATE TABLE stu(
	stuId INT PRIMARY KEY,
	stuName NVARCHAR(5) NOT NULL,
	gender INT NOT NULL	
)
GO
SET NOCOUNT ON
INSERT INTO stu(stuId, stuName,gender) VALUES (1,'小明',1)
INSERT INTO stu(stuId, stuName,gender) VALUES (2,'小华',1)
INSERT INTO stu(stuId, stuName,gender) VALUES (3,'小江',0)
GO
--- 以上为测试表及测试数据

--1.1 创建视图
CREATE VIEW view_stu
AS
SELECT 
	*
	,CASE WHEN gender=1 THEN '男' ELSE '女' END AS gender_desc 
FROM stu
GO
--1.2 查看视图,暂时看起来是没有问题的
SELECT * FROM view_stu
/*
stuId       stuName gender      gender_desc
----------- ------- ----------- -----------
1           小明      1           男
2           小华      1           男
3           小江      0           女
*/
GO
--2.1 为学生添加年级,默认为 2
ALTER TABLE stu ADD grade INT NOT NULL DEFAULT(2)
GO
--2.2 再查看视图, 发现 gender_desc 不再是正确的显示结果
SELECT * FROM view_stu
/*
stuId       stuName gender      gender_desc
----------- ------- ----------- -----------
1           小明      1           2
2           小华      1           2
3           小江      0           2
 */
GO

--3.1 用存储过程刷新视图
EXEC sp_refreshview 'view_stu'
--3.2 再来看视图,已正确。 
-- 但请记住,sp_refreshview 不是最好的方式, 因为不可能总去更新视图,*效率也比较低
SELECT * FROM view_stu
/*
stuId       stuName gender      grade       gender_desc
----------- ------- ----------- ----------- -----------
1           小明      1           2           男
2           小华      1           2           男
3           小江      0           2           女
*/

GO
--4.1 修改视图为正确的方式

ALTER VIEW view_stu
AS
SELECT 
	stuId
	,stuName
	,gender
	,CASE WHEN gender=1 THEN '男' ELSE '女' END AS gender_desc 
FROM stu
GO
--4.2 查看视图, 正确了
SELECT * FROM view_stu
/*
stuId       stuName gender      gender_desc
----------- ------- ----------- -----------
1           小明      1           男
2           小华      1           男
3           小江      0           女
*/

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值