欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-02 11:51:18
...
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           女
*/