找不到存储过程ISDATE

时间:2019-03-14 21:16:47

标签: sql-server tsql

下面是一个函数,据我所知没有错误,但是当我尝试构建它时,出现错误“找不到存储过程ISDATE”

第二点,如果无论如何还是我的逻辑比我的逻辑有更好的解决方案,请告诉我。

要求是有一个基准日,并每月附加该日以表示一个范围。如果基准日是29、30或31,并且2月滚动,则会出现问题,您将收到来自SQL的错误消息,指出它不是有效日期。此功能的目的是获取三个日期部分,并尝试确定一个有效的日期以返回。

CREATE FUNCTION Configuration.CreateDate
(
    @Year INT,
    @Month INT,
    @Day INT
)
RETURNS DATE
AS
BEGIN
    DECLARE @ReturnDate DATE

    DECLARE @DateString varchar
    DECLARE @VaildDate INT = 0;

    WHILE @VaildDate = 0
        BEGIN 
            SET @DateString = CAST(@Year AS VARCHAR(4)) + '-' +CAST(@Month AS VARCHAR(4)) + '-' + CAST(@Day AS VARCHAR(4))

            IF ISDATE(@DateString) = 1
                SET @ReturnDate = CAST(@DateString AS DATE)
                SET @VaildDate = 1
            ELSE 
                SET @Day = @Day - 1
        END

    RETURN @ReturnDate

END
GO

1 个答案:

答案 0 :(得分:1)

IF ISDATE(@DateString) = 1

要替换为:

IF TRY_CAST(@DateString AS DATE) IS NOT NULL

调整了整个功能的DDL:

CREATE FUNCTION Configuration.CreateDate
(
    @Year INT,
    @Month INT,
    @Day INT
)
RETURNS DATE
AS
BEGIN
    DECLARE @ReturnDate DATE

    DECLARE @DateString varchar
    DECLARE @VaildDate INT = 0;

    WHILE @VaildDate = 0
        BEGIN 
            SET @DateString = CAST(@Year AS VARCHAR(4)) + '-' +CAST(@Month AS VARCHAR(4)) + '-' + CAST(@Day AS VARCHAR(4))

            IF TRY_CAST(@DateString AS DATE) IS NOT NULL
            BEGIN
                SET @ReturnDate = CAST(@DateString AS DATE)
                SET @VaildDate = 1
            END
            ELSE 
                SET @Day = @Day - 1
        END

    RETURN @ReturnDate

END
  

第二点,无论如何,如果我有更好的解决方案,   而不是我的逻辑,请让我知道。

请考虑完全不要将标量函数用于此类目的。如果确实需要将此类逻辑封装到某个函数中,请选择内联类型的UDF,而不是标量类型。