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 女
*/
上一篇: mysql事务不加锁一致性读
下一篇: Table固定表头固定列