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