目錄

一. 前提小知識(數據庫連接,數據庫,SCHEMA,Table的關係)

二. 添加備註

2.1 添加備註基本語法(sys.sp_addextendedproperty)

2.2 SQL演示

2.3?fn_listextendedproperty函數查詢備註個數

2.4 開發常用添加註釋語法

三. 修改備註

3.1 修改備註基本語法(sys.sp_updateextendedproperty)

3.2 需要注意的坑

3.3 添加註釋與修改註釋的搭配使用

四. 刪除備註

4.1 刪除備註基本語法


一. 前提小知識(數據庫連接,數據庫,SCHEMA,Table的關係)

數據庫我們比較熟悉的就是數據庫DataBase,然後就是數據庫中的表Table;

但在它們二者中間,還有一箇中間者,叫"SCHEMA",一個數據庫可以有多個"SCHEMA","SCHEMA"是數據庫的一個邏輯結構,,用於組織數據庫對象,如表、視圖、存儲過程等。如下圖所示,

sql server 添加表註釋、字段註釋_字段

(1)數據庫連接(數據庫服務器):我們知道,數據庫都是一個個的鏈接,我們都過IP和端口去連接各個數據庫服務器,所以連接是最大的一個單位;

**(2)數據庫:**其次,我們就會發現,在連接的數據庫服務器中,會有1~多個數據庫DataBase,通常情況下一個項目會有多個數據庫;

**(3)SCHEMA:**再次,在每個數據庫DataBase下,還會有多個SCHEMA,每個SCHEMA都是一個獨立的小單位,它們之間互相隔絕,每個SCHEMA都有自己的權限和對象,從而實現更好的數據隔離和安全性。

**(4)Table表:**最後,在每個SCHEMA之下沒我們可以建立多張表,這個大家都很熟悉,就不多説了,每張表存儲着不同的實體對象數據;

總結下來,一個數據庫連接(數據庫服務器)下可以有多個數據庫(DataBase),一個數據庫下可以有多個SCHEMA,一個SCHEMA下可以建立多張數據表。所以它們的關係就是 數據庫連接>數據庫>SCHEMA>Table;瞭解了這個小知識,我們開始進入正題。

二. 添加備註
2.1 添加備註基本語法(sys.sp_addextendedproperty)

在SQL server中,使用"sys.sp_addextendedproperty"即可向表中的字段添加註釋。

舉例:現有一個表名叫 “MyTable”,表中有一個列的字段叫 “MyColumn”。

如下SQL,就是給字段 MyColumn 添加註釋,註釋即為 “MyColumn字段的描述”。

EXEC sys.sp_addextendedproperty
-- @name=N'MS_Description'添加備註的描述,固定寫法@value=N'這是MyColumn字段的描述',
     @name=N'MS_Description',@value=''就是我們要給字段添加的備註內容                //
-- @level0type=N'SCHEMA' 指定了級別0的類型為架構,name則指架構的名稱為dbo。
     @level0type=N'SCHEMA', @level0name=N'dbo',
-- @level0name=N'dbo' 指定了級別1的類型為表,name則指表名為MyTable。
     @level1type=N'TABLE', @level1name=N'MyTable',
-- @level2type=N'COLUMN' 指定了級別2的類型為列,name指要添加註釋的列名為MyColumn
     @level2type=N'COLUMN', @level2name=N'MyColumn';
2.2 SQL演示

**(a)**如下圖所示,在本地連接 ‘local’ 中,有數據庫 ‘fccbdb’ ,數據庫下有 SCHEAM 叫 ‘dbo’,現在我使用上述SQL給主鍵ID添加註釋;

sql server 添加表註釋、字段註釋_數據庫_02

**(b)**SQL如下

-- 給 log_fccb 表中的 ID 字段添加註釋
EXEC sys.sp_addextendedproperty
    @name=N'MS_Description',
    @value=N'主鍵ID',
    @level0type=N'SCHEMA', @level0name=N'dbo',
    @level1type=N'TABLE', @level1name=N'log_fccb',
    @level2type=N'COLUMN', @level2name=N'ID';

**©**然後運行上述 SQL 語句,我們再打開 log_fccb 表,就會看到此時的主鍵ID已經被添加上註釋了;

sql server 添加表註釋、字段註釋_數據庫_03

**(d)**此外,fccbdb下 還有 SCHEMA 叫 guest,但並沒有任何的表數據,我們一會做對比看一下,將上述SQL語句中的SCHEMA由dbo改為guest再次執行;

EXEC sys.sp_addextendedproperty
    @name=N'MS_Description',
    @value=N'新註釋主鍵ID',
    @level0type=N'SCHEMA', @level0name=N'guest',
    @level1type=N'TABLE', @level1name=N'log_fccb',
    @level2type=N'COLUMN', @level2name=N'ID';

sql server 添加表註釋、字段註釋_數據庫_04

**(e)**執行上述SQL語句,就會出現下方的報錯信息,錯誤信息"guest.log_fccb.ID"不存在,這也是正常的,我們剛才説了。guest下是空的,自然沒有表,也沒有名叫ID的字段;所以也側面印證了SCHEMA是表的上一級,需要在SQL語句中指定某個SCHEMA下的某張表的某個字段,才能去通過SQL為其添加註釋。

sql server 添加表註釋、字段註釋_數據庫_05

2.3fn_listextendedproperty函數查詢備註個數

在SQL server中,提供了fn_listextendedproperty函數,通過它可以返回某個列的備註數量,通常為0或者1,為0表示該字段沒有被添加備註,為1則表示當前字段已經有備註。

**(a)**使用語法如下,其中括號內的8個參數與上面 sp_addextendedproperty 添加註釋函數中的8個參數一樣,但是查詢不需要寫"@name=N’MS_Description’, @value=N’錯誤信息’,所以只剩下6個參數",還可以將前面的@xxx省略。

-- 查詢log_fccb表中字段ID的備註個數
SELECT COUNT(*)
FROM fn_listextendedproperty
('MS_Description', 'SCHEMA',
'dbo', 'TABLE',
'log_fccb', 'COLUMN', 'ID')

**(b)**運行上述SQL,即可得到下圖所示結果,顯示 field 為1,表示當前ID字段有一個註釋;

sql server 添加表註釋、字段註釋_數據庫_06

**©**我們可以在換一個字段,換成當前log_fccb 表 errorMsg 字段,再次編輯執行SQL,如下圖所示,得到的結果field就是0;

sql server 添加表註釋、字段註釋_字段_07

**(d)**然後我們打開 log_fccb 數據表結構,如下圖所示,errorMsg字段確實沒有被添加註釋;

sql server 添加表註釋、字段註釋_字段_08

2.4 開發常用添加註釋語法

上面説的都是瑣碎的語法,我們平常自己練習的時候可以使用,但在日常開發過程中,對數據庫SQL腳本的要求是比較高的,最好不要出錯,或者再執行腳本前去數據庫中做判斷。

(1)比如創建表,首先要判斷是否存在,如果存在先刪除,刪除之後再創建;

(2)比如添加字段,要先判斷字段是否存在,若存在先刪除,刪除之後再重新添加新的字段類型;

同理,註釋也是一樣的,我們再給表中的字段添加註釋之前,要先判斷當前字段是否已經存在註釋,若存在則不添加;

此時,我們就可以將剛才的兩個函數結合使用,再搭配 IF 語句做判斷;

**(a)**SQL如下所示

-- IF做判斷,括號內即為 fn_listextendedproperty 函數,返回值為0或1,
-- 如果為0,説明做判斷的字段沒有備註,就調用 sp_addextendedproperty
-- 函數為其添加備註,如果返回值為1不等於0,則後面的函數也不會執行,
-- 由此就達到了沒有備註添加備註有備註則不做任何操作的目的
IF (
	SELECT COUNT(*)
	FROM fn_listextendedproperty('MS_Description', 'SCHEMA', 'dbo', 'TABLE', 'log_fccb', 'COLUMN', 'errorMsg')
) = 0
EXEC sp_addextendedproperty
@name=N'MS_Description', @value=N'錯誤信息',
@level0type=N'SCHEMA', @level0name=N'dbo',
@level1type=N'TABLE', @level1name=N'log_fccb',
@level2type=N'COLUMN', @level2name=N'errorMsg';

**(b)**上面也説到了,fn_listextendedproperty 函數中的8個參數前置可以省略,同理sp_addextendedproperty 也可以省略,省略完畢之後,我們的SQL就得到了極大的簡化,簡化後如下

IF (
		SELECT COUNT(*)
	  FROM fn_listextendedproperty('MS_Description', 'SCHEMA', 'dbo', 'TABLE', 'log_fccb', 'COLUMN', 'errorMsg')
) = 0
EXEC sp_addextendedproperty
N'MS_Description', N'錯誤信息',
N'SCHEMA', N'dbo',
N'TABLE', N'log_fccb',
N'COLUMN', N'errorMsg';

**©**運行上述SQL,結果如下執行成功

sql server 添加表註釋、字段註釋_SQL_09

**(d)**然後我們再打開 log_fccb 表,就可以看到 errorMsg 字段已經被我們成功添加註釋;

sql server 添加表註釋、字段註釋_SQL_10

三. 修改備註
3.1 修改備註基本語法(sys.sp_updateextendedproperty)

在SQL server中,使用"sys.sp_updateextendedproperty"即可更新表中字段的註釋。和剛才的添加註釋方法幾乎沒有區別,只是換了一個函數;

**(a)**舉例:繼續拿上面的 log_fccb 表舉例,將剛才給ID字段添加的註釋 “主鍵ID” 修改為 “新的備註主鍵ID” ,SQL如下。

--  更新log_fccb 表中字段ID的備註為 "新的備註主鍵ID"
EXEC sys.sp_updateextendedproperty
N'MS_Description', N'新的註釋主鍵ID',
N'SCHEMA', N'dbo',
N'TABLE', N'log_fccb',
N'COLUMN', N'ID';

**(b)**執行SQL,如下所示顯示成功,

sql server 添加表註釋、字段註釋_數據庫_11

**©**然後我們打開 log_fccb 表,就可以看到主鍵ID的備註已經被修改為新的了;

sql server 添加表註釋、字段註釋_數據庫_12

3.2 需要注意的坑

**(a)**雖然使用sys.sp_updateextendedproperty 可以幫助我們修改字段的備註,但是特也有坑需要我們注意,如果我們要修改備註的字段根本就沒有添加備註,它就會修改失敗;如下圖所示,顯示該字段沒有 “MS_Description” 屬性,該屬性是在給字段添加過註釋之後才有的,沒有添加過註釋的字段是沒有的,所以會報錯。

sql server 添加表註釋、字段註釋_SQL_13

**(b)**如下圖所示,我給 res_text 字段修改備註為"響應文本",但實際上該字段原本沒有備註,執行SQL,就會報出如下錯誤;

3.3 添加註釋與修改註釋的搭配使用

**©**上面我們將fn_listextendedproperty 函數和sp_addextendedproperty 函數搭配使用給沒有備註的字段添加註釋,這裏我們可以繼續擴展,再搭配上sys.sp_updateextendedproperty 更新函數更新表的字段;

**(d)**SQL如下所示

-- 1. 判斷 res_text 字段當前有沒有註釋,如果沒有則為其添加註釋 "響應文本666"
IF (
		SELECT COUNT(*)
	  FROM fn_listextendedproperty('MS_Description', 'SCHEMA', 'dbo', 'TABLE', 'log_fccb', 'COLUMN', 'res_text')
) = 0
EXEC sp_addextendedproperty
N'MS_Description', N'響應文本666',
N'SCHEMA', N'dbo',
N'TABLE', N'log_fccb',
N'COLUMN', N'res_text'
-- 2. 判斷當前res_text 字段當前有沒有註釋,如果有則把註釋改為 "響應文本999"
else IF (
		SELECT COUNT(*)
	  FROM fn_listextendedproperty('MS_Description', 'SCHEMA', 'dbo', 'TABLE', 'log_fccb', 'COLUMN', 'res_text')
) = 1
EXEC sys.sp_updateextendedproperty
N'MS_Description', N'響應文本999',
N'SCHEMA', N'dbo',
N'TABLE', N'log_fccb',
N'COLUMN', N'res_text';

**(e)**運行SQL,得到OK,説明執行成功,

sql server 添加表註釋、字段註釋_SQL_14

**(f)**打開 log_fccb 表,可以看到 res_text 字段 註釋已經被改為 "響應文本999"目的達成

四. 刪除備註
4.1 刪除備註基本語法

**(a)**刪除其實都沒什麼好説的,因為開發過程中我們幾乎都是去添加或者修改註釋,不會去刪除註釋,但還是提一嘴,刪除註釋函數為 dorp ,然後下方8個參數不需要寫註釋,因為要刪掉註釋,當然不需要寫註釋內容,所以剩下7個參數,其他語法不變;示例SQL如下所示;

-- 刪除 log_fccb 表中 errorMsg 字段的備註
EXEC sys.sp_dropextendedproperty
    @name=N'MS_Description',
    @level0type=N'SCHEMA', @level0name=N'dbo',
    @level1type=N'TABLE', @level1name=N'log_fccb',
    @level2type=N'COLUMN', @level2name=N'errorMsg';

**(b)**執行此SQL,如下圖OK成功

sql server 添加表註釋、字段註釋_字段_15

**©**打開 log_fccb 表,可以看到 errorMsg 字段的註釋已經被刪除了;

sql server 添加表註釋、字段註釋_數據庫_16