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 年引入的,在以前的版本中不可用。
我正在尝试编写一个新数据库的脚本,并为一个操作准备一个有效的定标函数脚本。作为一名优秀的脚本编写者,我想在尝试执行 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 年引入的,在以前的版本中不可用。