下面是一个函数,据我所知没有错误,但是当我尝试构建它时,出现错误“找不到存储过程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
答案 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,而不是标量类型。