2017-04-05 105 views
0

我试图在SQL下执行时收到此错误消息。Msg 178,Level 15,State 1,Line 8具有返回值的RETURN语句无法在此上下文中使用

错误:

Msg 156, Level 15, State 1, Line 5 Incorrect syntax near the keyword 'FUNCTION'. Msg 178, Level 15, State 1, Line 8 A RETURN statement with a return value cannot be used in this context.

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语句创建一个函数?

+1

这不是你如何调用一个函数。您将需要创建该函数然后调用它。同样看着你的功能,除了投射'9999-12-31'作为日期之外,它并没有真正做任何事情。为什么当你的日期是静态时你需要一个函数 –

+0

我建议你阅读https://docs.microsoft.com/en-us/sql/t-sql/statements/create-function-transact-sql –

回答

0

如果statment这种方式,您将通过创建这个变量的变量STOR的创建查询收到以下警告

Incorrect syntax: CREATE FUNCTION must be the only statment in the batch

enter image description here

,你可以做到这一点,执行不能创建内部的功能它:

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

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

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 *”当你只是想知道是否存在某种价值。当你只是想知道是否存在任何东西时,它会产生不必要的开销,以使所有列。