我在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] ()
...
答案 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)
如果不存在则创建功能
首先使用此关键短语
创建函数