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 具有列的系統對象的每列都對應一行。
type對象類型列表