Sql server 删除过程(如果存在)无法运行SQL Server 2016
我已经使用SQL Server Management Studio 2016 v13.0.16生成了存储过程。生成脚本后,我已经执行了脚本,我得到一个错误: 关键字“IF”附近的语法不正确 错误发生在第行:Sql server 删除过程(如果存在)无法运行SQL Server 2016,sql-server,Sql Server,我已经使用SQL Server Management Studio 2016 v13.0.16生成了存储过程。生成脚本后,我已经执行了脚本,我得到一个错误: 关键字“IF”附近的语法不正确 错误发生在第行: DROP PROCEDURE IF EXISTS [dbo].[SP_Test] 我已检查SQL Server版本: select @@version 结果是: Microsoft SQL Server 2012 (SP4) (KB4018073) - 11.0.7001.0 (X64
DROP PROCEDURE IF EXISTS [dbo].[SP_Test]
我已检查SQL Server版本:
select @@version
结果是:
Microsoft SQL Server 2012 (SP4) (KB4018073) - 11.0.7001.0 (X64)
Aug 15 2017 10:23:29
Copyright (c) Microsoft Corporation Express Edition (64-bit) on Windows NT 6.3 <X64> (Build 14393: ).
生成的脚本为:
DROP PROCEDURE IF EXISTS [dbo].[SP_Test]
Incorrect syntax near the keyword 'IF'.
/****** Object: StoredProcedure [dbo].[SP_Test] Script Date: 02/24/2020 12:28:17 PM ******/
DROP PROCEDURE IF EXISTS [dbo].[SP_Test]
GO
/****** Object: StoredProcedure [dbo].[SP_Test] Script Date: 02/24/2020 12:28:17 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[SP_Test]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[SP_Test] AS'
END
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[SP_Test]
AS
BEGIN
select * from Emp
END
GO
有人帮我吗?DROP PROCEDURE语句的IF EXISTS参数仅在SQL Server 2016及更新版本中可用
如果存在
适用于:SQL Server SQL Server 2016 13.x至当前版本
您可以在早期版本中使用2语句方法:
IF (OBJECT_ID('dbo.SPName', 'P') IS NOT NULL) BEGIN
DROP PROCEDURE dbo.SPName;
END;
CREATE PROCEDURE sbo.SPName...
只需检查sp是否存在…如果存在,则使用sysobjects删除
这将适用于所有其他版本的SQL Server您使用的是SQL Server 2012而不是2016我使用的是SQL Server management studio 2016 management studio是客户端工具而不是SQL Server数据库。请参见打印@@version显示为SQL Server 2012的版本。版本有问题,我需要更改注意:您不应该在存储过程中使用sp_uu前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用sp_u,并使用其他东西作为前缀——或者根本不使用前缀!它工作得很好。但是,如果存在[dbo].[SP_Test],为什么要将SQL server脚本生成为删除过程?因为在SQL server 2012中,如果存在不是一件事,我正在使用SSMS 2016。SQL server版本显示为SQL 2012。如何更改?SSMS不是SQL Server。SSMS是一个客户端应用程序,重要的是SQL Server的版本。使用更新版本的SSMS不会神奇地升级它所连接的SQL Server。服务器仍需理解该语句,而不管客户端应用程序SSM如何,SQL server 2012都无法理解该语句是否存在。谢谢,我将要求我办公室的IT团队将SQL server 2016从SQL server 2012更改为SQL server 2016。我知道上述脚本工作正常。但是我的电脑的主要问题是SSMS 2016和SQL server 2012如果存在,请从sysobjects中选择Top 1,其中id=object_idN'[dbo].[SP_Test]'和OBJECTPROPERTYid,N'IsProcedure'=1 BEGIN DROP PROCEDURE[dbo].[SP_Test]END@@@Raju Gaddam代替select*from…您可以使用Top 1 1..这将使速度更快…@Akhilessingh在EXISTS的上下文中Top 1 1和select*之间实际上没有性能差异。@@Pred…Top 1 1和select*…之间有差异。。。。。Top 1 1将只拾取一列。另一方面,选择*将拾取所有列并选中…因此在这方面存在差异。。。
IF EXISTS (SELECT Top 1 1 FROM sysobjects WHERE id = object_id(N'[dbo].[SP_Test]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
BEGIN
DROP PROCEDURE [dbo].[SP_Test]
END
/****** Object: StoredProcedure [dbo].[SP_Test] Script Date: 02/24/2020 12:28:17 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[SP_Test]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[SP_Test] AS'
END
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[SP_Test]
AS
BEGIN
select * from Emp
END
GO