sql-server - SQL Server 函数的返回值

标签 sql-server function stored-procedures

我想从今天起最后一个星期六 + 21 天。

为了实现这一点,我编写了如下所示的脚本。但问题是我无法成功从结果中返回值。

我想在 SQL Server 中创建这个函数,并将在我想要的存储过程中获取这个值。

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

你能指导我实现我的目标吗?谢谢

最佳答案

就这样改写表值函数 :

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

比做:
SELECT *
FROM dbo.Get_NextSaturdayDay()

输出:
SaturdayDates
2016-10-15 11:02:33.570

如果您需要 标量值函数 :
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

然后运行:
SELECT  dbo.Get_NextSaturdayDay()

输出:
2016-10-15 11:02:33.570

关于sql-server - SQL Server 函数的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39786353/

相关文章:

java - 尝试更新 SQL 数据库条目时收到 SQL 语法错误。我如何弄清楚这里出了什么问题?

sql-server - 历史表的优点、缺点和陷阱 - 使用触发器、存储过程或在应用程序级别

sql-server - 在数据库中搜索数据

javascript - 如何重新排列这些缓动函数以接受 v0、v1 和 t?

混合类型的mysql存储过程动态排序

sql - 是否可以在 SQL Server 中同时运行 2 个查询

function - Lua 中奇怪的构造

php - 对图像的宽度和高度执行检查

MySQL 更新同一个表上的 TRIGGER

java - 通过可调用语句从 Java 调用存储过程时出错