2017-04-05 40 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 *」當你只是想知道是否存在某種價值。當你只是想知道是否存在任何東西時,它會產生不必要的開銷,以使所有列。

相關問題