创建存储过程时,SQL Server先分析代码以检查语法错误。如果代码通过语法检查,SQL Server将会尝试解析它所包含的名称。解析过程会验证对象名称和列名称是否存在。若引用对象存在,解析过程将被完整的执行,就是说它还会继续检查引用的列名称是否存在。
如果对象名称存在,但其中的列不存在,解析过程将生成一个错误,该存储过程将不会被创建。若对象根本不存在,SQL Server却可以创建存储过程,并把解析过程推迟到调用存储过程时在执行。
演示一下:
以下代码确保数据库中tempdb不存在存储过程usp_Proc1, usp_Proc2和表T1
USE tempdb;
GO
IF OBJECT_ID(‘dbo.usp_Proc1’) IS NOT NULL
DROP PROC dbo.usp_Proc1;
GO IF OBJECT_ID(‘dbo.usp_Proc2’) IS NOT NULL
DROP PROC dob.usp_Proc2;
IF OBJECT_ID('dbo.T1') IS NOT NULL
DROP TABLE dbo.T1;
运行以下代码创建存储过程usp_Proc1,它引用表T1,而该表不存在
CREATE PROC dbo.usp_Proc1
AS
SELECT col1 FROM T1;
GO
表T1不存在,解析将被推迟到运行时执行,存储过程可以顺利地被创建。
如果调用该存储过程时T1不存在,运行时将失败
如:EXEC dbo.usp_Proc1; 将会产生错误
创建表T1
CREATE TABLE T1(col1 INT);
INSERT INTO dbo.T1(col1) VALUES(1);
再次调用该存储过程,成功
然后创建存储过程usp_Proc2,引用已存在的T1表中不存在的col2列。
CREATE PROC usp_Proc2
AS
SELECT col2 FROM T1;
GO
该存储过程创建不成功。