3 votes

Valeur de retour d'une fonction dans SQL Server

Je veux obtenir le dernier samedi d'aujourd'hui + 21 jours.

Pour ce faire, j'ai écrit le script ci-dessous. Mais le problème est que je n'arrive pas à faire en sorte que success renvoie la valeur du résultat.

Je veux créer cette fonction dans SQL Server et obtenir cette valeur dans une procédure stockée à l'endroit voulu.

DECLARE @StartDate DATETIME 
DECLARE @EndDate DATETIME 
DECLARE @NumOfDays INT
DECLARE @resultDate smalldatetime

SET @StartDate = GETDATE()
SET @EndDate = GETDATE()+21
SET @NumOfDays = DATEDIFF(DD,@StartDate , @EndDate) + 1 ;

WITH Tens AS
(
    SELECT 1 N UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 1 UNION ALL 
    SELECT 1 
),
HUNDREDS AS
(
    SELECT T1.N FROM TENS T1 CROSS JOIN TENS T2
),
THOUSANDS AS
(
    SELECT T1.N FROM HUNDREDS T1 CROSS JOIN HUNDREDS T2
),
Numbers AS
(
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 0)) RN FROM THOUSANDS
)
SELECT TOP 1  
    DATEADD(DD, (RN - 1), @StartDate) SaturdayDates
FROM 
    Numbers
WHERE 
    RN <= @NumOfDays 
    AND DATENAME (WEEKDAY, (DATEADD(DD, (RN - 1), @StartDate))) = 'Saturday' 
ORDER BY 
    SaturdayDates DESC

Pouvez-vous me guider pour atteindre mon objectif ? Merci de votre compréhension.

2voto

gofr1 Points 13671

Il suffit de le réécrire comme suit fonction à valeur de tableau :

CREATE FUNCTION dbo.Get_NextSaturdayDay()
RETURNS TABLE 
AS
RETURN 
(
    -- Add the SELECT statement with parameter references here
    WITH Tens AS
    (
        SELECT 1 N UNION ALL 
        SELECT 1 UNION ALL 
        SELECT 1 UNION ALL 
        SELECT 1 UNION ALL 
        SELECT 1 UNION ALL 
        SELECT 1 UNION ALL 
        SELECT 1 UNION ALL 
        SELECT 1 UNION ALL 
        SELECT 1 UNION ALL 
        SELECT 1 
    ),
    HUNDREDS AS
    (
        SELECT T1.N FROM TENS T1 CROSS JOIN TENS T2
    ),
    THOUSANDS AS
    (
        SELECT T1.N FROM HUNDREDS T1 CROSS JOIN HUNDREDS T2
    ),
    Numbers AS
    (
        SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 0)) RN FROM THOUSANDS
    )
    SELECT  TOP 1 DATEADD( DD,(RN - 1) , GETDATE() )  as SaturdayDates 
    FROM 
      Numbers
    WHERE 
      RN <= (DATEDIFF(DD,GETDATE() , DATEADD(day,21,GETDATE()) ) + 1) AND DATENAME ( WEEKDAY, (DATEADD( DD,(RN - 1) , GETDATE() )) ) = 'Saturday' 

      ORDER BY SaturdayDates  DESC
)
GO

Qu'à cela ne tienne :

SELECT *
FROM dbo.Get_NextSaturdayDay()

Sortie :

SaturdayDates
2016-10-15 11:02:33.570

Si vous avez besoin fonction à valeur scalaire :

CREATE FUNCTION dbo.Get_NextSaturdayDay ()
RETURNS datetime
AS
BEGIN

    DECLARE @datetime datetime

    ;WITH Tens AS
    (
        SELECT 1 N UNION ALL 
        SELECT 1 UNION ALL 
        SELECT 1 UNION ALL 
        SELECT 1 UNION ALL 
        SELECT 1 UNION ALL 
        SELECT 1 UNION ALL 
        SELECT 1 UNION ALL 
        SELECT 1 UNION ALL 
        SELECT 1 UNION ALL 
        SELECT 1 
    ),
    HUNDREDS AS
    (
        SELECT T1.N FROM TENS T1 CROSS JOIN TENS T2
    ),
    THOUSANDS AS
    (
        SELECT T1.N FROM HUNDREDS T1 CROSS JOIN HUNDREDS T2
    ),
    Numbers AS
    (
        SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 0)) RN FROM THOUSANDS
    )
    SELECT  TOP 1 @datetime = DATEADD( DD,(RN - 1) , GETDATE() )
    FROM 
      Numbers
    WHERE 
      RN <= (DATEDIFF(DD,GETDATE() , DATEADD(day,21,GETDATE()) ) + 1) AND DATENAME ( WEEKDAY, (DATEADD( DD,(RN - 1) , GETDATE() )) ) = 'Saturday' 

      ORDER BY DATEADD( DD,(RN - 1) , GETDATE() ) DESC
        -- Return the result of the function
        RETURN @datetime

END
GO

Ensuite, courez :

SELECT  dbo.Get_NextSaturdayDay()

Sortie :

2016-10-15 11:02:33.570

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X