Sta*_*ace 11 t-sql sql-server stored-procedures
IF EXISTS ( SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'LOCATION') AND type IN (N'P', N'PC'))
DROP PROCEDURE [dbo].[LOCATION]
GO
CREATE PROCEDURE [dbo].[LOCATION]
@IP NVARCHAR(100)
AS
BEGIN
DECLARE @IPNumber BIGINT
SELECT @IPNumber = dbo.ConvertIp2Num(@IP)
SELECT [country_code],[country_name]
FROM [myDatabase].[dbo].[CountryIP]
WHERE @IPNumber BETWEEN ip_from AND ip_to
END
Run Code Online (Sandbox Code Playgroud)
我有上面的代码来检查当前数据库中是否存在存储过程LOCATION.我希望它会丢弃并重新创建程序(如果存在).
但是,如果该过程存在,则代码仍在执行,因此我收到以下错误:"数据库中已存在名为"LOCATION"的对象.
为什么该代码如果存在则无法删除该程序?
相同的代码适用于同一数据库中的另一个过程.
Pரத*_*ீப் 12
试试这个(使用视图的首选方法):
IF EXISTS(SELECT 1
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_NAME = 'PRC_NAME'
AND SPECIFIC_SCHEMA = 'schema_name')
BEGIN
DROP PROCEDURE PRC_NAME
END
Run Code Online (Sandbox Code Playgroud)
或者这个(不推荐使用直接访问系统表):
IF EXISTS (SELECT 1
FROM SYS.PROCEDURES
WHERE NAME = 'PRC_NAME'
AND SCHEMA_NAME(SCHEMA_ID) = 'SCHEMA_NAME'
AND [TYPE] IN (N'P',N'PC'))
BEGIN
DROP PROCEDURE PRC_NAME
END
Run Code Online (Sandbox Code Playgroud)
为什么第一种方法是首选的,你可以在这个问题中找到:SQL Server:我应该在sys表上使用information_schema表吗?
Qbe*_*ben 11
这有点晚了,但是最终在这里的其他人可能想查看一下你可以使用的MSDN文档:
DROP PROCEDURE IF EXISTS dbo.uspMyProc;
GO
Run Code Online (Sandbox Code Playgroud)
但是,这可以从SQL Server 2016社区技术预览版3.3(CTP 3.3)获得.
你可以使用:
IF OBJECT_ID('MSL_GET_IP_LOCATION', 'P') IS NOT NULL
DROP PROCEDURE MSL_GET_IP_LOCATION
GO
Run Code Online (Sandbox Code Playgroud)
进一步考虑这一点,你需要确保所有对象都有唯一的名称.
| 归档时间: |
|
| 查看次数: |
36962 次 |
| 最近记录: |