函数中的瓦尔查尔比较



我有以下函数:

CREATE FUNCTION ISRELKDVG(@WUNSCH_LIEFERTERMIN VARCHAR) RETURNS int AS
BEGIN
    DECLARE @sTerminNone VARCHAR(8)
    DECLARE @sTerminFrom VARCHAR(8)
    SET @sTerminNone = '00000000'
    SET @sTerminFrom = CONVERT(VARCHAR(8), GETDATE() - 100, 112) -- 100 days in the past
    IF (@WUNSCH_LIEFERTERMIN <> @sTerminNone AND @WUNSCH_LIEFERTERMIN >= @sTerminFrom)
        RETURN 1
    RETURN 0
END

作为函数参数给出的变量是一个日期,其形式为"YYYYMMDD"。问题是该函数永远不会返回 1。

我找到了链接,该链接说将 varchar 与未指定的长度进行比较可能会导致错误。它是否也指 varchar 传递给函数?

不要依赖隐式转换,使用未知的日期格式。转换为日期或日期时间,指定日期格式,并比较这些值。

指定函数参数的大小,例如 varchar(8)。否则,默认情况下长度为 1 个字符:

declare @c as varchar
set @c = '20130101'
select @c -- returns 2

试试这个:

CREATE FUNCTION ISRELKDVG(@WUNSCH_LIEFERTERMIN VARCHAR(8)) 返回 INT AS开始    声明@sTerminNone瓦尔查尔(8)    声明@sTerminFrom日期    SET @sTerminNone = '00000000'    如果 (@WUNSCH_LIEFERTERMIN = @sTerminNone)        返回 0    SET @sTerminFrom = DATEADD(day,-100,GETDATE()) -- 过去 100 天    如果(投射(@WUNSCH_LIEFERTERMIN 作为日期)>= @sTerminFrom)        返回 1    返回 0         结束选择 DBO。ISRELKDVG('00000000') --0选择 DBO。ISRELKDVG('20030901') --0选择 DBO。ISRELKDVG('20130901') --1选择 DBO。ISRELKDVG('20130730') --1

是的,这是主要问题。

MSDN - 备注

当数据定义或变量声明中未指定 n 时 语句,默认长度为 1。使用时未指定 n 时 CAST 和 CONVERT 函数,默认长度为 30。

但是(即使在转换/转换的情况下),您也应该始终定义长度以避免此类麻烦。

改变

@WUNSCH_LIEFERTERMIN VARCHAR --<--Length is 1 by default

@WUNSCH_LIEFERTERMIN VARCHAR(8) --Or length as appropriate

其次,您应该比较Dates而不是Strings

DECLARE @sTerminNone DATE = CONVERT(DATETIME, 0) --<--DATE (Assign correct date)
DECLARE @sTerminFrom DATE = GETDATE() - 100

最后

IF (CONVERT(DATE, @WUNSCH_LIEFERTERMIN, 112) <> @sTerminNone AND --Not sure if you need this
    CONVERT(DATE, @WUNSCH_LIEFERTERMIN, 112) >= @sTerminFrom)
    RETURN 1
ELSE
    RETURN 0

理想情况下,您应该向函数传递/定义DateType parameter

相关内容

  • 没有找到相关文章

最新更新