SQL存儲(chǔ)過(guò)程入門(mén)級(jí)教程 |
|
|
臨時(shí)存儲(chǔ)過(guò)程 SQL Server 支持兩種臨時(shí)過(guò)程:局部臨時(shí)過(guò)程和全局臨時(shí)過(guò)程。局部臨時(shí)過(guò)程只能由創(chuàng)建該過(guò)程的連接使用。全局臨時(shí)過(guò)程則可由所有連接使用。局部臨時(shí)過(guò)程在當(dāng)前會(huì)話結(jié)束 時(shí)自動(dòng)除去。全局臨時(shí)過(guò)程在使用該過(guò)程的最后一個(gè)會(huì)話結(jié)束時(shí)除去。通常是在創(chuàng)建該過(guò)程的會(huì)話結(jié)束時(shí)。 臨時(shí)過(guò)程用 # 和 ## 命名,可以由任何用戶創(chuàng)建。創(chuàng)建過(guò)程后,局部過(guò)程的所有者是唯一可以使用該過(guò)程的用戶。執(zhí)行局部臨時(shí)過(guò)程的權(quán)限不能授予其他用戶。如果創(chuàng)建了全局臨時(shí)過(guò) 程,則所有用戶均可以訪問(wèn)該過(guò)程,權(quán)限不能顯式廢除。只有在 tempdb 數(shù)據(jù)庫(kù)中具有顯式 CREATE PROCEDURE 權(quán)限的用戶,才可以在該數(shù)據(jù)庫(kù)中顯式創(chuàng)建臨時(shí)過(guò)程(不使用編號(hào)符命名)??梢允谟杌驈U除這些過(guò)程中的權(quán)限。 說(shuō)明 頻繁使用臨時(shí)存儲(chǔ)過(guò)程會(huì)在 tempdb 中的系統(tǒng)表上產(chǎn)生爭(zhēng)用,從而對(duì)性能產(chǎn)生負(fù)面影響。建議使用 sp_executesql 代替。sp_executesql 不在系統(tǒng)表中存儲(chǔ)數(shù)據(jù),因此可以避免這一問(wèn)題。 自動(dòng)執(zhí)行存儲(chǔ)過(guò)程 SQL Server 啟動(dòng)時(shí)可以自動(dòng)執(zhí)行一個(gè)或多個(gè)存儲(chǔ)過(guò)程。這些存儲(chǔ)過(guò)程必須由系統(tǒng)管理員創(chuàng)建,并在 sysadmin 固定服務(wù)器角色下作為后臺(tái)過(guò)程執(zhí)行。這些過(guò)程不能有任何輸入?yún)?shù)。 對(duì)啟動(dòng)過(guò)程的數(shù)目沒(méi)有限制,但是要注意,每個(gè)啟動(dòng)過(guò)程在執(zhí)行時(shí)都會(huì)占用一個(gè)連接。如果必須在啟動(dòng)時(shí)執(zhí)行多個(gè)過(guò)程,但不需要并行執(zhí)行,則可以指定一個(gè)過(guò)程作為啟動(dòng)過(guò)程,讓該過(guò)程調(diào)用其它過(guò)程。這樣就只占用一個(gè)連接。 在啟動(dòng)時(shí)恢復(fù)了最后一個(gè)數(shù)據(jù)庫(kù)后,即開(kāi)始執(zhí)行存儲(chǔ)過(guò)程。若要跳過(guò)這些存儲(chǔ)過(guò)程的執(zhí)行,請(qǐng)將啟動(dòng)參數(shù)指定為跟蹤標(biāo)記 4022。如果以最低配置啟動(dòng) SQL Server(使用 -f 標(biāo)記),則啟動(dòng)存儲(chǔ)過(guò)程也不會(huì)執(zhí)行。 若要?jiǎng)?chuàng)建啟動(dòng)存儲(chǔ)過(guò)程,必須作為 sysadmin 固定服務(wù)器角色的成員登錄,并在 master 數(shù)據(jù)庫(kù)中創(chuàng)建存儲(chǔ)過(guò)程。 使用 sp_procoption 可以: 將現(xiàn)有存儲(chǔ)過(guò)程指定為啟動(dòng)過(guò)程。 停止在 SQL Server 啟動(dòng)時(shí)執(zhí)行過(guò)程。 查看 SQL Server 啟動(dòng)時(shí)執(zhí)行的所有過(guò)程的列表。 存儲(chǔ)過(guò)程嵌套 存儲(chǔ)過(guò)程可以嵌套,即一個(gè)存儲(chǔ)過(guò)程可以調(diào)用另一個(gè)存儲(chǔ)過(guò)程。在被調(diào)用過(guò)程開(kāi)始執(zhí)行時(shí),嵌套級(jí)將增加,在被調(diào)用過(guò)程執(zhí)行結(jié)束后,嵌套級(jí)將減少。如果超出最大的嵌套級(jí),會(huì)使整個(gè)調(diào)用過(guò)程鏈?zhǔn)?。可?nbsp;@@NESTLEVEL 函數(shù)返回當(dāng)前的嵌套級(jí)。 若要估計(jì)編譯后的存儲(chǔ)過(guò)程大小,請(qǐng)使用下列性能監(jiān)視計(jì)數(shù)器。 * 各種分類(lèi)的高速緩存對(duì)象均可以使用這些計(jì)數(shù)器,包括特殊 sql、準(zhǔn)備 sql、過(guò)程、觸發(fā)器等。 sql_statement 限制 除了 SET SHOWPLAN_TEXT 和 SET SHOWPLAN_ALL 之外(這兩個(gè)語(yǔ)句必須是批處理中僅有的語(yǔ)句),任何 SET 語(yǔ)句均可以在存儲(chǔ)過(guò)程內(nèi)部指定。所選擇的 SET 選項(xiàng)在存儲(chǔ)過(guò)程執(zhí)行過(guò)程中有效,之后恢復(fù)為原來(lái)的設(shè)置。 |
聯(lián)系客服