目錄
一. 前提小知識(數據庫連接,數據庫,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"是數據庫的一個邏輯結構,,用於組織數據庫對象,如表、視圖、存儲過程等。如下圖所示,
(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添加註釋;
**(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已經被添加上註釋了;
**(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';
**(e)**執行上述SQL語句,就會出現下方的報錯信息,錯誤信息"guest.log_fccb.ID"不存在,這也是正常的,我們剛才説了。guest下是空的,自然沒有表,也沒有名叫ID的字段;所以也側面印證了SCHEMA是表的上一級,需要在SQL語句中指定某個SCHEMA下的某張表的某個字段,才能去通過SQL為其添加註釋。
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字段有一個註釋;
**©**我們可以在換一個字段,換成當前log_fccb 表 errorMsg 字段,再次編輯執行SQL,如下圖所示,得到的結果field就是0;
**(d)**然後我們打開 log_fccb 數據表結構,如下圖所示,errorMsg字段確實沒有被添加註釋;
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,結果如下執行成功
**(d)**然後我們再打開 log_fccb 表,就可以看到 errorMsg 字段已經被我們成功添加註釋;
三. 修改備註
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,如下所示顯示成功,
**©**然後我們打開 log_fccb 表,就可以看到主鍵ID的備註已經被修改為新的了;
3.2 需要注意的坑
**(a)**雖然使用sys.sp_updateextendedproperty 可以幫助我們修改字段的備註,但是特也有坑需要我們注意,如果我們要修改備註的字段根本就沒有添加備註,它就會修改失敗;如下圖所示,顯示該字段沒有 “MS_Description” 屬性,該屬性是在給字段添加過註釋之後才有的,沒有添加過註釋的字段是沒有的,所以會報錯。
**(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,説明執行成功,
**(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成功
**©**打開 log_fccb 表,可以看到 errorMsg 字段的註釋已經被刪除了;