sys.columns视图
sys.columns是SQL Server从2005版本起引入的新的系统级视图。相关链接如下:
Mapping SQL Server 2000 System Tables to SQL Server 2005 System Views
https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2005/ms187997(v=sql.90)
sys.columns vs syscolumns
http://luke.breuer.com/time/item/syscolumns_vs_syscolumns/624.aspx
使用sys.columns,避免了直接访问系统表,这将使某些权限受限的用户直接受益。
INFORMATION_SCHEMA.columns 视图
而 INFORMATION_SCHEMA.columns 和 sys.columns 相比,INFORMATION_SCHEMA.columns更推荐。
因为INFORMATION_SCHEMA.columns是符合ISO标准的,而sys.columns这种东西是微软自家搞出来的私有的东西。
其实INFORMATION_SCHEMA.columns 和 sys.columns二者本质上来说都是view。二者本质一样的前提下,我们推荐符合ISO标准的,这样的话这种experience也能和其它database的experience保持一致。
关于INFORMATION_SCHEMA,相关链接如下:
Information Schema Views (Transact-SQL)
https://docs.microsoft.com/zh-cn/sql/relational-databases/system-information-schema-views/system-information-schema-views-transact-sql?view=sql-server-2017
因此,举个例子,假如我们要判断某个表是否存在某个字段,如果不存在则添加该字段并且绑定一个默认值,那么我的推荐写法如下:
-- Alter table LabelSkin: Add column Width if not exists ( select column_name from INFORMATION_SCHEMA.columns where table_name = 'LabelSkin' and column_name = 'Width' ) ALTER TABLE dbo.LabelSkin ADD Width numeric(18, 0) NOT NULL CONSTRAINT DF_LabelSkin_Width DEFAULT 0;
sys.columns(全部列):包含sys.all_columns (用户定义列)、sys.system_columns (系统定义列)
-sys.columns 为包含列的对象(如视图或表)的每一列返回一行。
——sys.all_columns 显示属于用户定义对象和系统对象的所有列的联合。
——sys.system_columns 具有列的系统对象的每列都对应一行。