2015-09-29 3 views
4

я написал функцию, которая возвращает 1, если разница дата уже больше или равна 30.Возвращаемое значение не может быть использована в этом контексте

Вот мой код:

DECLARE @flag int 
DECLARE @isactive bit 
DECLARE @date Datetime 

SET @flag = 0 

SELECT @isactive = [m_isactive] 
FROM dbo.rms_month_email 
WHERE m_id = 3 

SELECT @date = [m_createddate] 
FROM dbo.rms_month_email 
WHERE m_id = 3 

IF (@isactive = 1 AND DATEDIFF(dd,@date,GETDATE()) = 30) 
    SET @flag = 1 

RETURN @flag 

но он сгенерировал эту ошибку:

Msg 178, Level 15, State 1, Line 16
A RETURN statement with a return value cannot be used in this context.

Что это значит?

CREATE FUNCTION [dbo].[udf_isBonus] 
(@m_id AS INT) 
RETURNS INT 
AS 
BEGIN 
    -- Declare the return variable here 
    DECLARE @flag AS int 
    DECLARE @isactive AS bit 
    DECLARE @date AS Datetime 

    SET @flag = 0 

    SELECT @isactive = [m_isactive] FROM dbo.rms_month_email WHERE m_id = @m_id 
    SELECT @date = [m_createddate] FROM dbo.rms_month_email WHERE m_id = @m_id 

    IF (@isactive = 1 AND DATEDIFF(dd,@date,GETDATE()) = 30) 
     SET @flag = 1 

    RETURN @flag 
END 
GO 

Это код для этой функции.

+0

Предоставить всю вашу функцию с 'CREATE FUNCTION Name ...' , Похоже, у вас неправильный синтаксис. –

+0

Здесь я не вижу определения функции. Если вы хотите проверить тело функции в пакете, используйте 'SELECT @ flag' вместо' RETURN'. – Pred

+1

Я не вижу ошибок в этой функции. Голосование за закрытие –

ответ

4

Вам необходимо понять, что Return работает только внутри функции или хранимой процедуры. Если вы не используете его внутри функции или хранимой процедуры, это всего лишь партия выбранных операторов. Поэтому вам нужно использовать select вместо return.

SQL DEMO

EDIT:

Ваша правка после модифицировали его как функция отлично работает.

SQL DEMO

1

Попробуйте использовать CASE вместо IF и удалить SET @flag = 0:

USE [petc_rms] 
GO 

/****** Object: UserDefinedFunction [dbo].[udf_isBonus] Script Date:  9/29/2015 3:35:49 PM ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 


CREATE FUNCTION [dbo].[udf_isBonus] 
(
-- Add the parameters for the function here 

    @m_id AS INT 

) 
RETURNS INT 
AS 
BEGIN 
-- Declare the return variable here 
DECLARE @flag AS int 
DECLARE @isactive AS bit 
DECLARE @date AS Datetime 


    SELECT @isactive = [m_isactive] FROM dbo.rms_month_email WHERE m_id = @m_id 
    SELECT @date = [m_createddate] FROM dbo.rms_month_email WHERE m_id = @m_id 

    SET @flag = CASE WHEN @isactive = 1 AND DATEDIFF(dd,@date,GETDATE()) = 30 THEN 1 ELSE 0 END  

Return @flag 

END 

GO 

Проверить о том, как CREATE FUNCTION

+1

Что вы указали? –

+0

@IamGlads пытаются проверить сейчас. –

+0

Большое вам спасибо! поэтому у меня возникла проблема с флагом. еще раз спасибо. –

Смежные вопросы