Gor*_*yII 127 sql stored-procedures sql-server-2005
我必须编写一个部署脚本,如果存储过程存在或不存在,该脚本将起作用.即如果它存在,那么我需要改变它,否则创建它.
我怎么能在sql中这样做.
我正在使用SQL Server 2005
And*_*mar 159
如果您DROP并创建该过程,您将失去安全设置.这可能会惹恼您的DBA或完全破坏您的应用程序.
我所做的是创建一个简单的存储过程,如果它还不存在.之后,您可以根据自己的喜好更改存储过程.
IF object_id('YourSp') IS NULL
EXEC ('create procedure dbo.YourSp as select 1')
GO
ALTER PROCEDURE dbo.YourSp
AS
...
Run Code Online (Sandbox Code Playgroud)
这样,安全设置,注释和其他元细分将在部署后继续存在.
Aar*_*ton 142
最干净的方法是测试它的存在,如果它存在则删除它,然后重新创建它.您不能在IF语句中嵌入"create proc"语句.这应该做得很好:
IF OBJECT_ID('MySproc', 'P') IS NOT NULL
DROP PROC MySproc
GO
CREATE PROC MySproc
AS
BEGIN
...
END
Run Code Online (Sandbox Code Playgroud)
Jas*_*onS 31
如果您只处理存储过程,最简单的方法是删除proc,然后重新创建它.您可以使用SQL Server中的Generate Scripts向导生成所有代码来执行此操作.
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[YourSproc]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[YourSproc]
CREATE PROCEDURE YourSproc...
Run Code Online (Sandbox Code Playgroud)
Pரத*_*ீப் 17
从SQL Server 2016 CTP3您可以使用新的DIE 语句而不是大IF包装器
句法:
DROP {PROC | 程序} [IF EXISTS] {[schema_name.]程序} [,... n]
查询:
DROP PROCEDURE IF EXISTS usp_name
Run Code Online (Sandbox Code Playgroud)
更多信息在这里
Luk*_*fer 11
编辑:在代码块杀死之前不放文本...总是忘记:)
if not exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[xxx]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
BEGIN
CREATE PROCEDURE dbo.xxx
Run Code Online (Sandbox Code Playgroud)
其中xxx是proc名称
您可以按如下方式编写查询:
IF OBJECT_ID('ProcedureName','P') IS NOT NULL
DROP PROC ProcedureName
GO
CREATE PROCEDURE [dbo].[ProcedureName]
...your query here....
Run Code Online (Sandbox Code Playgroud)
更具体地说明上述语法:
OBJECT_ID是数据库中对象的唯一 ID 号,它由 SQL Server 在内部使用。由于我们传递的是ProcedureName后跟对象类型P,它告诉 SQL Server 你应该找到名为ProcedureName的对象,它是过程类型,即 P
此查询将找到该过程,如果它可用,它将删除它并创建新的过程。
有关 OBJECT_ID 和对象类型的详细信息,请访问:SYS.Objects