简体   繁体   English

SQL Server-如何带回函数中的WHILE BREAK循环以及其结果?

[英]SQL Server - How to bring back and the result of a WHILE BREAK Loop in a function?

I have this bit of code which works 我有这段有效的代码

DECLARE @IntDte as INT
SET @IntDte = 1
WHILE @IntDte <=10
BEGIN
IF (SELECT isworkday FROM Calendar WHERE date=CAST(FLOOR(CAST(GETDATE()-@IntDte As float))As datetime))= 1 -- 1 is a workday 0 is a weekend
            BREAK
            ELSE
        SET @IntDte= @IntDte + 1        
END
PRINT @IntDte

This brings back the last an integer that will bring back the last working day (ie if it is Monday today the loop will bring back 4 because that's Friday. 这将带回最后一个整数,该整数将带回最后一个工作日(即,如果今天是星期一,则循环将带回4,因为那是星期五。

What I want though which I'm struggling is to build this into a function to get the date. 我想尽力而为的是将其构建为获取日期的函数。 I have this so far but its not correct - 我到目前为止有这个,但它不正确-

Create FUNCTION [dbo].[PREVIOUSWORKINGDAY]
RETURNS datetime
AS BEGIN
DECLARE @PWD as datetime

SET @PWD = GetDate() -
(DECLARE @IntDte as INT
SET @IntDte = 2
WHILE @IntDte <=10
BEGIN
IF (SELECT isworkday FROM Calendar WHERE date=CAST(FLOOR(CAST(GETDATE()-@IntDte As float))As datetime))= 1 -- 1 is a workday 0 is a weekend
            BREAK
            ELSE
        SET @IntDte= @IntDte + 1        
END
RETURN)

RETURN @PWD
END

Would anyone be able to point out where im going wrong, at current im getting syntax errors - 在当前出现语法错误的情况下,任何人都可以指出错误之处-

Msg 102, Level 15, State 1, Procedure PREVIOUSWORKINGDAY, Line 2 Incorrect syntax near 'RETURNS'. 消息102,级别15,状态1,过程PREVIOUSWORKINGDAY,第2行'RETURNS'附近的语法不正确。

Msg 156, Level 15, State 1, Procedure PREVIOUSWORKINGDAY, Line 7 Incorrect syntax near the keyword 'DECLARE'. 消息156,级别15,状态1,过程PREVIOUSWORKINGDAY,第7行关键字'DECLARE'附近的语法错误。

Msg 102, Level 15, State 1, Procedure PREVIOUSWORKINGDAY, Line 16 Incorrect syntax near ')'. 消息102,级别15,状态1,过程PREVIOUSWORKINGDAY,第16行')'附近的语法不正确。

Msg 178, Level 15, State 1, Procedure PREVIOUSWORKINGDAY, Line 18 A RETURN statement with a return value cannot be used in this context. 消息178,级别15,状态1,过程PREVIOUSWORKINGDAY,第18行在这种情况下不能使用带有返回值的RETURN语句。

Im assuming I have some stuff in the wrong place but not sure where it should go. 我以为我在错误的地方放了一些东西,但不确定应该去哪里。

thanks 谢谢

The problem with your SQL looks to be that you have two return statements and you are trying to embed declare statements. SQL的问题似乎是您有两个return语句,并且您试图嵌入声明语句。 Here is how I'd re-write your version: 这是我重新编写您的版本的方法:

Create FUNCTION [dbo].[PREVIOUSWORKINGDAY]
RETURNS datetime
AS BEGIN
    DECLARE @PWD as datetime
    DECLARE @IntDte as INT

    SET @IntDte = 2
    WHILE @IntDte <=10
    BEGIN
        IF (SELECT isworkday FROM Calendar WHERE date=CAST(FLOOR(CAST(GETDATE()-@IntDte As float))As datetime))= 1 -- 1 is a workday 0 is a weekend
            BREAK
        ELSE
            SET @IntDte= @IntDte + 1        
    END

    SET @PWD = GetDate() - IntDte

    RETURN @PWD
END

This is how I would write it though. 我就是这样写的。

Create FUNCTION [dbo].[PREVIOUSWORKINGDAY]
RETURNS datetime
AS BEGIN
    DECLARE @PWD as datetime

        SELECT @PWD=Max(date)
        FROM Calendar
        WHERE isworkday=1
        AND date<CONVERT(DATE,GETDATE())

    RETURN @PWD
END

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM