SQL IF 范围上下文中 Return 的错误解释

SQL Misinterpretation of Return in IF Scope Context

我正在尝试编写一个新数据库的脚本,并为一个操作准备一个有效的定标函数脚本。作为一名优秀的脚本编写者,我想在尝试执行 Create Function 之前检查该函数是否存在,但是当我将两者结合使用时出现此错误:

Incorrect syntax near the keyword 'FUNCTION'. ... A RETURN statement with a return value cannot be used in this context.

如何才能两者兼顾?

IF NOT EXISTS (select 1 from INFORMATION_SCHEMA.ROUTINES
    where Specific_schema = 'util'
    AND   specific_name   = 'TableState_Boolean'
    AND   ROUTINE_TYPE    = 'FUNCTION')
BEGIN
    create FUNCTION util.TableState_Boolean()
    RETURNS tinyint
    as BEGIN return 1; END    
end

我会使用 CREATE OR ALTER 在 sql-server

中创建 Funcation
CREATE OR ALTER FUNCTION util.TableState_Boolean()
RETURNS tinyint
AS BEGIN 
    return 1; 
END; 

CREATE FUNCTION 必须是查询批处理中的第一条语句,因此使用动态 SQL,例如

IF NOT EXISTS (select 1 from INFORMATION_SCHEMA.ROUTINES
    where Specific_schema = 'util'
    AND   specific_name   = 'TableState_Boolean'
    AND   ROUTINE_TYPE    = 'FUNCTION')
BEGIN
    exec('
    create FUNCTION util.TableState_Boolean()
    RETURNS tinyint
    as BEGIN return 1; END    
    ')
end

分两步尝试,例如首先删除现有 UDF,然后像这样创建一个新的:

IF OBJECT_ID('util.TableState_Boolean') IS NOT NULL DROP FUNCTION util.TableState_Boolean
GO

CREATE FUNCTION util.TableState_Boolean ...
GO

。 . .或者反过来——如果它不存在,首先创建一个空的“存根”UDF,然后用它的新定义改变它,尽管在这种情况下你也必须使用动态 SQL。

IF OBJECT_ID('util.TableState_Boolean') IS NULL EXEC('CREATE FUNCTION dbo.TableState_Boolean() RETURNS tinyint AS BEGIN RETURN NULL END'
GO

ALTER FUNCTION util.TableState_Boolean ...
GO

顺便说一句,CREATE OR ALTER 是在 SQL 2016 年引入的,在以前的版本中不可用。