用于确定Sql 2012中是否存在存储过程的T-SQL

时间:2016-04-05 18:33:37

标签: sql-server visual-studio-2012

此代码:

SELECT * FROM sysobjects WHERE type = 'P' AND name = 'proc_name'

在Sql 2000中找到'proc_name'存储过程,但它不适用于Sql Server 2012.对此的变体,如下所示:

SELECT * FROM sys.objects  WHERE   object_id = OBJECT_ID
(N'ap_tems_delete_temp_itinerary_item]') AND type IN ( N'P', N'PC')

在Sql 2012中也不起作用。

有什么用?

为澄清而编辑

问题的关键在于,当使用此模板时:

IF EXISTS (select * from sys.procedures where name = '$SchemaQualifiedObjectName$')
BEGIN
   DROP Procedure  $SchemaQualifiedObjectName$
END

在Visual Studio中生成存储过程创建脚本,它在方括号中生成过程的名称,用[dbo]限定。当运行存储过程创建的脚本时,这不起作用:

IF EXISTS (select * from sys.procedures where name = '[dbo].[stored_proc_name]')
BEGIN
   DROP Procedure [dbo].[stored_proc_name]
END

这是因为存储过程的名称不包含dbo或方括号。我必须编辑它们,但我不想这样做。使用OBJECT_ID()的格式实际上是有效的,但是当你有一个方括号不匹配时,这就是我的问题实际上是什么,并且是@Ebis所指出的。

我知道select * from sys.procedures where name = 'stored_proc_name'确实有效 - 但如果有方括号则不行。

4 个答案:

答案 0 :(得分:1)

- 使用两个括号或让它们离开......

SELECT Object_ID FROM sys.objects  
WHERE   object_id = OBJECT_ID (N'[ap_tems_delete_temp_itinerary_item]') 
SELECT Object_ID FROM sys.objects  
WHERE   object_id = OBJECT_ID (N'ap_tems_delete_temp_itinerary_item') 

答案 1 :(得分:0)

自SQL 2005起,Microsoft开始对系统对象(如sys。***

)使用更结构化的命名

最简单的方法是:

select * from sys.procedures where name = 'proc_name'

答案 2 :(得分:0)

你可以使用它,

SELECT *
FROM   INFORMATION_SCHEMA.ROUTINES
WHERE  ROUTINE_NAME = 'PROCEDURE_NAME'
       AND ROUTINE_TYPE = 'PROCEDURE' 

答案 3 :(得分:0)

可能是最好的方法,没有直接查询SQL Server系统表(当你可以避免它时总是首选)正在使用Information_Schema:

Select * 
From Information_Schema.Routines 
Where Routine_Type = 'Procedure' And Routine_Name = 'proc_name"