设计存储过程(数据库引擎)

几乎所有可以写成批处理的 Transact-SQL 代码都可以用来创建存储过程。

存储过程的设计规则

存储过程的设计规则包括以下内容:

  • CREATE PROCEDURE 定义自身可以包括任意数量和类型的 SQL 语句,但以下语句除外。 不能在存储过程的任何位置使用这些语句。

    CREATE AGGREGATE

    CREATE RULE

    CREATE DEFAULT

    CREATE SCHEMA

    CREATE 或 ALTER FUNCTION

    CREATE 或 ALTER TRIGGER

    CREATE 或 ALTER PROCEDURE

    CREATE 或 ALTER VIEW

    SET PARSEONLY

    SET SHOWPLAN_ALL

    SET SHOWPLAN_TEXT

    SET SHOWPLAN_XML

    USE database_name

     

  • 其他数据库对象均可在存储过程中创建。 可以引用在同一存储过程中创建的对象,只要引用时已经创建了该对象即可。

  • 可以在存储过程内引用临时表。

  • 如果在存储过程内创建本地临时表,则临时表仅为该存储过程而存在;退出该存储过程后,临时表将消失。

  • 如果执行的存储过程将调用另一个存储过程,则被调用的存储过程可以访问由第一个存储过程创建的所有对象,包括临时表在内。

  • 如果执行对远程 Microsoft SQL Server 实例进行更改的远程存储过程,则不能回滚这些更改。远程存储过程不参与事务处理。

  • 存储过程中的参数的最大数目为 2100。

  • 存储过程中的局部变量的最大数目仅受可用内存的限制。

  • 根据可用内存的不同,存储过程最大可达 128 MB。

限定存储过程内的名称

在存储过程内,如果用于语句(例如 SELECT 或 INSERT)的对象名没有限定架构,则架构将默认为该存储过程的架构。 在存储过程内,如果创建该存储过程的用户没有限定 SELECT、INSERT、UPDATE 或 DELETE 语句中引用的表名或视图名,则默认情况下,通过该存储过程对这些表进行的访问将受到该过程创建者的权限的限制。

如果有其他用户要使用存储过程,则用于所有数据定义语言 (DDL) 语句(例如 CREATE、ALTER 或 DROP 语句,DBCC 语句,EXECUTE 和动态 SQL 语句)的对象名应该用该对象架构的名称来限定。 为这些对象指定架构名称可确保名称解析为同一对象,而不管存储过程的调用方是谁。 如果没有指定架构名称,SQL Server 将首先尝试使用调用方的默认架构或用户在 EXECUTE AS 子句中指定的架构来解析对象名称,然后尝试使用 dbo 架构。

对过程定义进行模糊处理

若要将 CREATE PROCEDURE 语句的原始文本转换为某种模糊格式,请使用 WITH ENCRYPTION 选项。 SQL Server 2008 中的任何系统表或视图都不会直接显示模糊处理的输出:没有系统表、系统视图或数据库文件访问权限的用户将无法检索经模糊处理的文本。 但是,能直接访问数据库文件的特权用户可获得此类文本。 这些用户可能能够对模糊代码进行反向工程,以检索存储过程定义的原始文本。

SET 语句选项

当创建或更改 Transact-SQL 存储过程后,数据库引擎将保存 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 语句时,该设置只在存储过程完成之前有效。 之后,该设置将还原为它在调用存储过程时的值。 这使得个别客户端可以设置所需的选项,而不会影响存储过程的逻辑。

注意注意

在传递存储过程或用户定义函数中的参数时,或在声明和设置批语句中的变量时,将忽略 ANSI_WARNINGS。 例如,如果定义一个变量 char(3),然后将其值设置为大于三个字符,则数据将被截断为定义的大小,INSERT 或 UPDATE 语句将成功。