消息178,级别15,状态1,行8具有返回值的RETURN语句不能在此上下文中使用

时间:2017-04-05 17:54:14

标签: sql sql-server sql-server-2008 tsql sql-function

尝试在SQL下执行时收到此错误消息。

错误:

  

第15行,第15行,第1行,第5行   关键字“FUNCTION”附近的语法不正确。   Msg 178,Level 15,State 1,Line 8   带有返回值的RETURN语句不能在此上下文中使用。

SQL:

IF (NOT EXISTS (SELECT * FROM DBO.TRACKING WHERE CR = 123)) 

BEGIN

  CREATE FUNCTION [dbo].[UDFDate]()
  RETURNS DATETIME
  AS BEGIN
     RETURN CAST('9999-12-31' AS DATETIME)
  END
END

我是否不允许在if语句中创建一个Function?

2 个答案:

答案 0 :(得分:2)

没有理由要在运行时期间在存储过程中创建函数。 SQL SERVER中的函数与存储过程的工作方式类似,因此如果要创建函数,则需要在存储过程的上下文和范围之外执行该函数,并将其保存在数据库中以便随时访问。

Ontopic,如果您只想展示该日期值,您可以删除函数创建并选择日期时间结果:

IF (NOT EXISTS (SELECT TOP 1 1 FROM DBO.TRACKING WHERE CR = 123)) 
BEGIN    
  SELECT CAST('9999-12-31' AS DATETIME)
END

PS:不要使用" SELECT *"当你只是想知道某个值是否存在时。当你只想知道是否存在所有列时,它会产生不必要的开销。

答案 1 :(得分:0)

您无法在if语句中创建函数,这样您将收到以下警告

  

语法不正确:CREATE FUNCTION必须是批次

中的唯一法规

enter image description here

你可以通过在这个变量中创建一个变量stor创建查询来执行它并执行它:

IF (NOT EXISTS (SELECT * FROM DBO.TRACKING WHERE CR = 123)) 

BEGIN

 DECLARE @strQuery AS VARCHAR(MAX)

 SET @strQuery = '

  CREATE FUNCTION [dbo].[UDFDate]()
  RETURNS DATETIME
  AS BEGIN
     RETURN CAST(''9999-12-31'' AS DATETIME)
  END
'

EXEC(@strQuery)

END

enter image description here

但我不明白为什么要创建一个返回静态值的函数?? !!