Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 找不到存储过程ISDATE_Sql Server_Tsql - Fatal编程技术网

Sql server 找不到存储过程ISDATE

Sql server 找不到存储过程ISDATE,sql-server,tsql,Sql Server,Tsql,下面是一个函数,从我看到没有错误,但是当我尝试构建它时,我得到错误“找不到存储过程ISDATE” 第二点,如果我的问题有比我的逻辑更好的解决方案,请告诉我 要求有一个基准日,并在每个月附加该日以表示范围。如果基准日是29日、30日或31日,并且2月滚动,您将收到来自SQL的错误消息,表示该日期无效。此函数的目的是获取三个日期部分,并尝试创建一个有效的返回日期 CREATE FUNCTION Configuration.CreateDate ( @Year INT, @Month

下面是一个函数,从我看到没有错误,但是当我尝试构建它时,我得到错误“找不到存储过程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
替换为:

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的内联类型,但不要选择标量类型。

我建议在这里使用try/catch方法。您的If语句有多个SQL表达式。必须在IF之后使用BEGIN/END,否则会在ELSECheers JM_u上出现语法错误。这就是endMate中的问题,函数的结构仍然有问题。将您的行替换为我的行会导致“关键字'ELSE'附近的语法不正确这是因为,
IF ELSE
多行子句必须用
BEGIN..END
…调整我的答案添加了BEGIN和END,修复了它。谢谢。
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