SQL存儲過程入門級教程 |
|
|
說明 SQL Server 是將空字符串解釋為單個空格還是解釋為真正的空字符串,由兼容級別設(shè)置控制。 如果兼容級別小于或等于 65,SQL Server 就將空字符串解釋為單個空格。 如果兼容級別等于 70,則 SQL Server 將空字符串解釋為空字符串。 獲得有關(guān)存儲過程的信息 若要顯示用來創(chuàng)建過程的文本,請在過程所在的數(shù)據(jù)庫中執(zhí)行 sp_helptext,并使用過程名作為參數(shù)。 說明 使用 ENCRYPTION 選項創(chuàng)建的存儲過程不能使用 sp_helptext 查看。 若要顯示有關(guān)過程引用的對象的報表,請使用 sp_depends。 若要為過程重命名,請使用 sp_rename。 引用對象 SQL Server 允許創(chuàng)建的存儲過程引用尚不存在的對象。在創(chuàng)建時,只進(jìn)行語法檢查。執(zhí)行時,如果高速緩存中尚無有效的計劃,則編譯存儲過程以生成執(zhí)行計劃。只有在編譯過 程中才解析存儲過程中引用的所有對象。因此,如果語法正確的存儲過程引用了不存在的對象,則仍可以成功創(chuàng)建,但在運行時將失敗,因為所引用的對象不存在。 延遲名稱解析和兼容級別 SQL Server 允許 Transact-SQL 存儲過程在創(chuàng)建時引用不存在的表。這種能力稱為延遲名稱解析。不過,如果 Transact-SQL 存儲過程引用了該存儲過程中定義的表,而兼容級別設(shè)置(通過執(zhí)行 sp_dbcmptlevel 來設(shè)置)為 65,則在創(chuàng)建時會發(fā)出警告信息。而如果在運行時所引用的表不存在,將返回錯誤信息。 執(zhí)行存儲過程 成功執(zhí)行 CREATE PROCEDURE 語句后,過程名稱將存儲在 sysobjects 系統(tǒng)表中,而 CREATE PROCEDURE 語句的文本將存儲在 syscomments 中。第一次執(zhí)行時,將編譯該過程以確定檢索數(shù)據(jù)的最佳訪問計劃。 使用 cursor 數(shù)據(jù)類型的參數(shù) 存儲過程只能將 cursor 數(shù)據(jù)類型用于 OUTPUT 參數(shù)。如果為某個參數(shù)指定了 cursor 數(shù)據(jù)類型,也必須指定 VARYING 和 OUTPUT 參數(shù)。如果為某個參數(shù)指定了 VARYING 關(guān)鍵字,則數(shù)據(jù)類型必須是 cursor,并且必須指定 OUTPUT 關(guān)鍵字。 說明 cursor 數(shù)據(jù)類型不能通過數(shù)據(jù)庫 API(例如 OLE DB、ODBC、ADO 和 DB-Library)綁定到應(yīng)用程序變量上。因為必須先綁定 OUTPUT 參數(shù),應(yīng)用程序才可以執(zhí)行存儲過程,所以帶有 cursor OUTPUT 參數(shù)的存儲過程不能通過數(shù)據(jù)庫 API 調(diào)用。只有將 cursor OUTPUT 變量賦值給 Transact-SQL 局部 cursor 變量時,才可以通過 Transact-SQL 批處理、存儲過程或觸發(fā)器調(diào)用這些過程。 Cursor 輸出參數(shù) 在執(zhí)行過程時,以下規(guī)則適用于 cursor 輸出參數(shù): 對于只進(jìn)游標(biāo),游標(biāo)的結(jié)果集中返回的行只是那些存儲過程執(zhí)行結(jié)束時處于或超出游標(biāo)位置的行,例如: 在過程中的名為 RS 的 100 行結(jié)果集上打開一個非滾動游標(biāo)。 過程提取結(jié)果集 RS 的頭 5 行。 過程返回到其調(diào)用者。 返回到調(diào)用者的結(jié)果集 RS 由 RS 的第 6 到 100 行組成,調(diào)用者中的游標(biāo)處于 RS 的第一行之前。 對于只進(jìn)游標(biāo),如果存儲過程完成后,游標(biāo)位于第一行的前面,則整個結(jié)果集將返回給調(diào)用批處理、存儲過程或觸發(fā)器。返回時,游標(biāo)將位于第一行的前面。 對于只進(jìn)游標(biāo),如果存儲過程完成后,游標(biāo)的位置超出最后一行的結(jié)尾,則為調(diào)用批處理、存儲過程或觸發(fā)器返回空結(jié)果集。 說明 空結(jié)果集與空值不同。 對于可滾動游標(biāo),在存儲過程執(zhí)行結(jié)束時,結(jié)果集中的所有行均會返回給調(diào)用批處理、存儲過程或觸發(fā)器。返回時,游標(biāo)保留在過程中最后一次執(zhí)行提取時的位置。 對于任意類型的游標(biāo),如果游標(biāo)關(guān)閉,則將空值傳遞回調(diào)用批處理、存儲過程或觸發(fā)器。如果將游標(biāo)指派給一個參數(shù),但該游標(biāo)從未打開過,也會出現(xiàn)這種情況。 說明 關(guān)閉狀態(tài)只有在返回時才有影響。例如,可以在過程中關(guān)閉游標(biāo),稍后再打開游標(biāo),然后將該游標(biāo)的結(jié)果集返回給調(diào)用批處理、存儲過程或觸發(fā)器。 |