是的,有理由不在SELECT *视图中使用。最重要的是 SQL Server 缓存了视图输出的元数据,如果底层对象发生变化,它不会神奇地更新。这是一个简单的示例来演示:
USE tempdb;
GO
-- simple table with two int columns
CREATE TABLE dbo.x(a INT, b INT);
GO
INSERT dbo.x(a,b) VALUES(1,2);
GO
-- simple view using SELECT *
CREATE VIEW dbo.v_x
AS
SELECT * FROM dbo.x;
GO
-- view will not be updated to see these changes:
EXEC sys.sp_rename N'dbo.x.b', N'c', N'COLUMN';
ALTER TABLE dbo.x ADD b DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
GO
-- view shows wrong data
SELECT * FROM dbo.x;
SELECT * FROM dbo.v_x;
GO
您需要强制 SQL Server 刷新其视图视图。
EXEC sys.sp_refreshview @viewname = N'dbo.v_x';
GO
-- now view is correct
SELECT * FROM dbo.v_x;
GO
现在为什么要为在视图中使用提出论据?因为您不想再次键入列名?您知道吗,您可以通过右键单击并说 Script View/Table As > SELECT To > 剪贴板轻松地从对象资源管理器生成列列表?或者通过将列文件夹拖到查询窗口上?SELECT *
是的,有理由不在
SELECT *
视图中使用。最重要的是 SQL Server 缓存了视图输出的元数据,如果底层对象发生变化,它不会神奇地更新。这是一个简单的示例来演示:您需要强制 SQL Server 刷新其视图视图。
现在为什么要为在视图中使用提出论据?因为您不想再次键入列名?您知道吗,您可以通过右键单击并说 Script View/Table As > SELECT To > 剪贴板轻松地从对象资源管理器生成列列表?或者通过将列文件夹拖到查询窗口上?
SELECT *
只是不要这样做。您在打字时节省的东西(以及您已经浪费在辩论上的时间)不值得冒险,也不能证明有一些例外是合理的
SELECT *
。由于多种原因,这是一种不好的做法,并且竭尽全力制造异常是不一致的,并且通常会鼓励初级开发人员做错事。事实上,我试图记住创建我所有的视图
WITH SCHEMABINDING
,以便以后更改它们是一种痛苦。我不希望能够随意改变观点,因为那是打破某些东西的万无一失的方式。