天天看點

關于SQL Server存儲過程的說明(基礎)

  建立存儲過程,存儲過程是儲存起來的可以接受和傳回使用者提供的參數的   Transact-SQL   語句的集合。   

  可以建立一個過程供永久使用,或在一個會話中臨時使用(局部臨時過程),或在所有會話中臨時使用(全局臨時過程)。   

  也可以建立在Microsoft SQL Server啟動時自動運作的存儲過程。   

  文法  

  CREATE   PROC   [   EDURE   ]   procedure_name   [   ;   number   ]  

          [   {   @parameter   data_type   }  

                  [   VARYING   ]   [   =   default   ]   [   OUTPUT   ]  

          ]   [   ,...n   ]  

  [   WITH  

          {   RECOMPILE   |   ENCRYPTION   |   RECOMPILE   ,   ENCRYPTION   }   ]     

  [   FOR   REPLICATION   ]     

  AS   sql_statement   [   ...n   ]     

  參數  

  procedure_name   

  新存儲過程的名稱。過程名必須符合辨別符規則,且對于資料庫及其所有者必須唯一。有關更多資訊,請參見使用辨別符。   

  要建立局部臨時過程,可以在   procedure_name   前面加一個編号符   (#procedure_name),要建立全局臨時過程,可以在   procedure_name   前面加兩個編号符   (##procedure_name)。完整的名稱(包括   #   或   ##)不能超過   128   個字元。指定過程所有者的名稱是可選的。   

  ;number   

  是可選的整數,用來對同名的過程分組,以便用一條   DROP   PROCEDURE   語句即可将同組的過程一起除去。例如,名為   orders   的應用程式使用的過程可以命名為   orderproc;1、orderproc;2   等。DROP   PROCEDURE   orderproc   語句将除去整個組。如果名稱中包含定界辨別符,則數字不應包含在辨別符中,隻應在   procedure_name   前後使用适當的定界符。   

  @parameter   

  過程中的參數。在   CREATE   PROCEDURE   語句中可以聲明一個或多個參數。使用者必須在執行過程時提供每個所聲明參數的值(除非定義了該參數的預設值)。存儲過程最多可以有   2.100   個參數。   

  使用   @   符号作為第一個字元來指定參數名稱。參數名稱必須符合辨別符的規則。每個過程的參數僅用于該過程本身;相同的參數名稱可以用在其它過程中。預設情況下,參數隻能代替常量,而不能用于代替表名、列名或其它資料庫對象的名稱。有關更多資訊,請參見   EXECUTE。     

  data_type   

  參數的資料類型。所有資料類型(包括   text、ntext   和   image)均可以用作存儲過程的參數。不過,cursor   資料類型隻能用于   OUTPUT   參數。如果指定的資料類型為   cursor,也必須同時指定   VARYING   和   OUTPUT   關鍵字。有關   SQL   Server   提供的資料類型及其文法的更多資訊,請參見資料類型。 

  說明     對于可以是   cursor   資料類型的輸出參數,沒有最大數目的限制。   

  VARYING   

  指定作為輸出參數支援的結果集(由存儲過程動态構造,内容可以變化)。僅适用于遊标參數。   

  default   

  參數的預設值。如果定義了預設值,不必指定該參數的值即可執行過程。預設值必須是常量或   NULL。如果過程将對該參數使用   LIKE   關鍵字,那麼預設值中可以包含通配符(%、_、[]   和   [^])。   

  OUTPUT   

  表明參數是傳回參數。該選項的值可以傳回給   EXEC[UTE]。使用   OUTPUT   參數可将資訊傳回給調用過程。Text、ntext   和   image   參數可用作   OUTPUT   參數。使用   OUTPUT   關鍵字的輸出參數可以是遊标占位符。   

  n   

  表示最多可以指定   2.100   個參數的占位符。   

  {RECOMPILE   |   ENCRYPTION   |   RECOMPILE,   ENCRYPTION}   

  RECOMPILE   表明   SQL   Server   不會緩存該過程的計劃,該過程将在運作時重新編譯。在使用非典型值或臨時值而不希望覆寫緩存在記憶體中的執行計劃時,請使用   RECOMPILE   選項。   

  ENCRYPTION   表示   SQL   Server   加密   syscomments   表中包含   CREATE   PROCEDURE   語句文本的條目。使用   ENCRYPTION   可防止将過程作為   SQL   Server   複制的一部分釋出。   

  說明     在更新過程中,SQL   Server   利用存儲在   syscomments   中的加密注釋來重新建立加密過程。   

  FOR   REPLICATION   

  指定不能在訂閱伺服器上執行為複制建立的存儲過程。.使用   FOR   REPLICATION   選項建立的存儲過程可用作存儲過程篩選,且隻能在複制過程中執行。本選項不能和   WITH   RECOMPILE   選項一起使用。   

  AS   

  指定過程要執行的操作。   

  sql_statement   

  過程中要包含的任意數目和類型的   Transact-SQL   語句。但有一些限制。   

  n   

  是表示此過程可以包含多條   Transact-SQL   語句的占位符。   

  注釋  

  存儲過程的最大大小為   128   MB。   

  使用者定義的存儲過程隻能在目前資料庫中建立(臨時過程除外,臨時過程總是在   tempdb   中建立)。在單個批進行中,CREATE   PROCEDURE   語句不能與其它   Transact-SQL   語句組合使用。     

  預設情況下,參數可為空。如果傳遞   NULL   參數值并且該參數在   CREATE   或   ALTER   TABLE   語句中使用,而該語句中引用的列又不允許使用   NULL,則   SQL   Server   會産生一條錯誤資訊。為了防止向不允許使用   NULL   的列傳遞   NULL   參數值,應向過程中添加程式設計邏輯或為該列使用預設值(使用   CREATE   或   ALTER   TABLE   的   DEFAULT   關鍵字)。   

  建議在存儲過程的任何   CREATE   TABLE   或   ALTER   TABLE   語句中都為每列顯式指定   NULL   或   NOT   NULL,例如在建立臨時表時。ANSI_DFLT_ON   和   ANSI_DFLT_OFF   選項控制   SQL   Server   為列指派   NULL   或   NOT   NULL   特性的方式(如果在   CREATE   TABLE   或   ALTER   TABLE   語句中沒有指定的話)。如果某個連接配接執行的存儲過程對這些選項的設定與建立該過程的連接配接的設定不同,則為第二個連接配接建立的表列可能會有不同的為空性,并且表現出不同的行為方式。如果為每個列顯式聲明了   NULL   或   NOT   NULL,那麼将對所有執行該存儲過程的連接配接使用相同的為空性建立臨時表。   

  在建立或更改存儲過程時,SQL   Server   将儲存   SET   QUOTED_IDENTIFIER   和   SET   ANSI_NULLS   的設定。執行存儲過程時,将使用這些原始設定。是以,所有用戶端會話的   SET   QUOTED_IDENTIFIER   和   SET   ANSI_NULLS   設定在執行存儲過程時都将被忽略。在存儲過程中出現的   SET   QUOTED_IDENTIFIER   和   SET   ANSI_NULLS   語句不影響存儲過程的功能。   

  其它   SET   選項(例如   SET   ARITHABORT、SET   ANSI_WARNINGS   或   SET   ANSI_PADDINGS)在建立或更改存儲過程時不儲存。如果存儲過程的邏輯取決于特定的設定,應在過程開頭添加一條   SET   語句,以確定設定正确。從存儲過程中執行   SET   語句時,該設定隻在存儲過程完成之前有效。之後,設定将恢複為調用存儲過程時的值。這使個别的用戶端可以設定所需的選項,而不會影響存儲過程的邏輯。   

  說明     SQL   Server   是将空字元串解釋為單個空格還是解釋為真正的空字元串,由相容級别設定控制。如果相容級别小于或等于   65,SQL   Server   就将空字元串解釋為單個空格。如果相容級别等于   70,則   SQL   Server   将空字元串解釋為空字元串。有關更多資訊,請參見   sp_dbcmptlevel。     

  獲得有關存儲過程的資訊  

  若要顯示用來建立過程的文本,請在過程所在的資料庫中執行   sp_helptext,并使用過程名作為參數。     

  說明     使用   ENCRYPTION   選項建立的存儲過程不能使用   sp_helptext   檢視。   

  若要顯示有關過程引用的對象的報表,請使用   sp_depends。     

  若要為過程重命名,請使用   sp_rename。     

  引用對象  

  SQL   Server   允許建立的存儲過程引用尚不存在的對象。在建立時,隻進行文法檢查。執行時,如果高速緩存中尚無有效的計劃,則編譯存儲過程以生成執行計劃。隻有在編譯過程中才解析存儲過程中引用的所有對象。是以,如果文法正确的存儲過程引用了不存在的對象,則仍可以成功建立,但在運作時将失敗,因為所引用的對象不存在。有關更多資訊,請參見延遲名稱解析和編譯。

  延遲名稱解析和相容級别  

  SQL   Server   允許   Transact-SQL   存儲過程在建立時引用不存在的表。這種能力稱為延遲名稱解析。不過,如果   Transact-SQL   存儲過程引用了該存儲過程中定義的表,而相容級别設定(通過執行   sp_dbcmptlevel   來設定)為   65,則在建立時會發出警告資訊。而如果在運作時所引用的表不存在,将傳回錯誤資訊。有關更多資訊,請參見   sp_dbcmptlevel   和延遲名稱解析和編譯。     

  執行存儲過程  

  成功執行   CREATE   PROCEDURE   語句後,過程名稱将存儲在   sysobjects   系統表中,而   CREATE   PROCEDURE   語句的文本将存儲在   syscomments   中。第一次執行時,将編譯該過程以确定檢索資料的最佳通路計劃。

  使用   cursor   資料類型的參數  

  存儲過程隻能将   cursor   資料類型用于   OUTPUT   參數。如果為某個參數指定了   cursor   資料類型,也必須指定   VARYING   和   OUTPUT   參數。如果為某個參數指定了   VARYING   關鍵字,則資料類型必須是   cursor,并且必須指定   OUTPUT   關鍵字。

繼續閱讀