如何在创建过程或函数之前终止SQL脚本

时间:2017-07-02 14:07:45

标签: sql-server stored-procedures

我在SQL Server 2014中有以下脚本用于创建名为GetFiscalPeriod的标量函数。在创建函数之前,脚本必须检查函数是否存在

USE [DatabaseName]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

IF EXISTS (select * from dbo.sysobjects where 
     id = object_id(N'[dbo].[GetFiscalPeriod]') 
     and OBJECTPROPERTY(id, N'IsScalarFunction') = 1)
--want to terminate the whole batch
RETURN --doesn't work the way I want
--seems to terminate IF batch only
GO

CREATE FUNCTION [dbo].[GetFiscalPeriod] ()
Returns INT
AS
BEGIN
    RETURN (select MAX(Id) from dbo.__FiscalPeriod__);
END

我想让它在IF体内到达时终止整个事物。 (RETURN

问题是无论我如何更改代码,它都会跳转到CREATE FUNCTION给出此错误:

  

数据库中已经有一个名为'GetFiscalPeriod'的对象。

或者给出了这种语法错误(当我尝试将CREATE FUNCTION放在IF子句中时):

  

'CREATE FUNCTION'必须是查询批处理中的第一个语句。

问题是:

当对象名存在时,有没有告诉SQL忽略脚本的其余部分?

注意:

我以前经常放弃这个功能,而且它有效。但我不想每次都丢弃并重新创建所有内容。

...
IF EXISTS (select * from dbo.sysobjects where 
     id = object_id(N'[dbo].[GetFiscalPeriod]') 
     and OBJECTPROPERTY(id, N'IsScalarFunction') = 1)
DROP FUNCTION [dbo].[GetFiscalPeriod] --works
GO

CREATE FUNCTION [dbo].[GetFiscalPeriod] ()
...

4 个答案:

答案 0 :(得分:1)

你可以检查是否存在,如果存在则另外创建: 你必须以字符串形式执行查询。

IF not EXISTS (select * from dbo.sysobjects where id = object_id(N'[dbo].[GetFiscalPeriod]') and OBJECTPROPERTY(id, N'IsScalarFunction') = 1)
execute sp_executesql N'
CREATE FUNCTION [dbo].[GetFiscalPeriod] () 
Returns INT
AS
BEGIN
    RETURN (select MAX(Id) from dbo.__FiscalPeriod__);
END'
else
N'
ALTER FUNCTION [dbo].[GetFiscalPeriod] () 
Returns INT
AS
BEGIN
    RETURN (select MAX(Id) from dbo.__FiscalPeriod__);
END'

答案 1 :(得分:1)

您可以使用动态sql以下列方式进行检查。

declare @var nvarchar(max) 
  ='CREATE FUNCTION [dbo].[GetFiscalPeriod] ()
  Returns INT
  AS
  BEGIN
  RETURN (select MAX(Id) from dbo.__FiscalPeriod__);
  END' 
IF Not EXISTS (funname) --function name for which the existence should be 
begin                   --checked
exec sp_executesql @var            
end
GO

答案 2 :(得分:1)

如果没有动态SQL,您需要引发错误以阻止调用应用程序运行脚本的其余部分。对于-b

,可以使用SQLCMD命令行参数完成此操作
SQLCMD -S YourServer -d YourDatabase -E -iYourScript.sql -I -b

执行脚本中的T-SQL引发错误并终止执行:

IF OBJECT_ID(N'dbo.GetFiscalPeriod', 'FN') IS NOT NULL
    RAISERROR('Function GetFiscalPeriod already exists', 16, 1);

如果您使用的是SQL Server 2016 SP1或更高版本,则可以使用CREATE OR ALTER来避免事先删除对象。在我看来,即使它存在,你也希望重新创建它,因为它可能是不同的。

答案 3 :(得分:-1)

如果不存在则创建功能

首先使用此关键短语

创建函数