2010-05-21 116 views
1

我正在VisualParadigm中开发一个简单的数据库体系结构,最近运行了下一个代码摘录。SQL Server存储过程含义

IF EXISTS (SELECT * FROM sys.objects 
WHERE object_id = OBJECT_ID(N'getType') AND type in (N'P', N'PC')) 
DROP PROCEDURE getType; 

下一页转到我的存储过程:

CREATE PROCEDURE getType @typeId int 
AS 
SELECT * FROM type t WHERE t.type_id = @typeId; 

谁能解释这是什么意思/做(前者)?

P.S .:这很好,如果你也可以检查任何语法错误,因为我完全不熟悉SQL Server和存储过程。

回答

2

IF EXISTS部分首先检查是否存在具有相同名称的存储过程。如果是这样,它会在创建之前将其删除。没有这个检查,你会得到一个存储过程已经存在的错误。

+0

对不起,但很明显。内部选择部分呢?这是什么sys.objects? – 2010-05-21 18:46:05

+2

对不起,这是显而易见的。 Sys.objects是一个包含所有对象的系统表。我恳请您参考您可信的SQL Server文档(尝试它),也可从http://msdn.microsoft.com/en-us/library/ms190324.aspx获得 - 解释sys.objects。 – TomTom 2010-05-21 18:47:59

+0

我如何接受评论作为正确的答案(而不是只对其投票)? :) – 2010-05-21 19:15:21

0

看起来这是生成数据库的脚本的一部分。第一条语句会查看您的存储过程称为“getType”是否存在。如果确实如此,那么它会放弃它。为什么?因为下一行将创建它。

它可以创建它并确保它与当前版本的过程相匹配的唯一方法是将create更改为alter。这将使更长的代码,因为它将不得不列出两次sproc。或者它可以生成动态的SQL,它几乎没有那么干净。

0

它做了删除并重新创建

如果调用getType的数据库对象存在:

WHERE object_id = OBJECT_ID(N'getType') 

,这是一个存储过程:

AND type in (N'P', N'PC')) 

再加入之前砸你存储过程:

DROP PROCEDURE getType; 
1

a CREATE PROCEDURE getType...如果对象已经存在将会失败。通过包含IF EXISTS...代码,如果该代码首先存在,将删除该对象,则会消除该错误并运行CREATE...

OBJECT_ID(N'getType')只返回名为N'getType'的对象的数字ID,AND type in (N'P', N'PC'))确保该对象是P =存储过程或PC = Assembly(CLR)。

你可以尝试使用这样的事情,所以你可以使用ALTER保持权限(DROP + CREATE删除所有):

BEGIN TRY EXEC ('CREATE PROCEDURE YourProcedureName AS SELECT ''ERROR'' RETURN 999') END TRY BEGIN CATCH END CATCH 
GO 
ALTER PROCEDURE YourProcedureName 
AS 
SELECT 'WORKS!2' 
GO 

EXEC YourProcedureName 

OUTPUT:

------- 
WORKS!2 

(1 row(s) affected) 
0

第一个查询下降过程,如果它存在。第二个创建一个采用整型参数并返回结果集的新过程。

1

添加到Raj的帖子中,没有办法使用存储过程执行“upsert”。创建过程语句必须是该批次的第一个语句。因此,下面的工作:

If Not Exists(Select 1 From sys.procedures Where Name = 'getType') 
    Create Procedure... 
Else 
    Alter Procedure... 

的唯一手段,以“更新”的程序,而不必如果它已经存在就是放弃它并重新创建它,它抛出一个错误。

加成

为了解决你在意见中提出一个具体的问题,sys.objects中是包含所有对象(表,约束列,索引等,每个“事情”的列表中的目录视图数据库)其中的程序就是其中之一。因此,这是检查过程对象(基于类型的过滤器)是否存在。 sys.objects表/视图的主键是object_id,它是一个整数。在你的例子中,他们使用OBJECT_ID函数来查找对象getType的id并确定它是否是一个过程。 (它可能只是使用If OBJECT_ID(N'getType') is not null是安全的,但为了防止另一个具有该名称的对象不是一个过程,他们添加了对象类型的检查)。