SQL Server(00):INFORMATION_SCHEMA.columns 与sys.columns 与 syscolumns对比

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,避免了直接访问系统表,这将使某些权限受限的用户直接受益。

image

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;

image

sys.columns(全部列):包含sys.all_columns (用户定义列)、sys.system_columns (系统定义列)

-sys.columns 为包含列的对象(如视图或表)的每一列返回一行。
——sys.all_columns 显示属于用户定义对象和系统对象的所有列的联合。
——sys.system_columns 具有列的系统对象的每列都对应一行。

type对象类型列表

原文地址:https://www.cnblogs.com/springsnow/p/10374156.html