此代码:
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'
确实有效 - 但如果有方括号则不行。
答案 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"