【问题标题】:How to print DateTime variable in the RAISERROR method?如何在 RAISERROR 方法中打印 DateTime 变量?
【发布时间】:2011-05-31 00:04:01
【问题描述】:

我的存储过程接受两个参数 @EffectiveStartDate 日期时间
@EffectiveEndDate 日期时间

我这样写验证码:

IF(@EffectiveStartDate > @EffectiveEndDate)
        BEGIN
            RAISERROR ('SPName: InsertUpdateLiquidityDateRule:  Start Date: %s cannot  be greater than End Date %s',11,1,CAST(@EffectiveStartDate AS varchar(30)),CAST(@EffectiveEndDate AS varchar(30)));
            RETURN -1
        END 

我可以知道我在这里做错了什么。

在编译我的 SProc 时,它引发了消息“CAST() 附近的语法不正确”

【问题讨论】:

    标签: sql sql-server sql-server-2005 stored-procedures raiserror


    【解决方案1】:

    提供的值必须是常量或变量。您不能将函数名称指定为参数值。 (来自 MSDN Executing Stored Procedures)。

    你需要做这样的事情:

    declare @EffectiveStartDateText varchar(30)
    set @EffectiveStartDateText = cast(@EffectiveStartDate as varchar)
    
    declare @EffectiveEndDateText varchar(30)
    set @EffectiveEndDateText = cast(@EffectiveEndDate as varchar)
    
    RAISERROR (
        'SPName: InsertUpdateLiquidityDateRule:  Start Date: %s cannot  be greater than End Date %s',
        11,
        1,
        @EffectiveStartDateText,
        @EffectiveEndDateText);
    

    【讨论】:

    • 你说“你不能将函数名指定为参数值”是什么意思。我所尝试的只是将 datetime sproc 参数显式转换为 varchar。存储过程参数的处理方式是否与本地声明的变量不同?
    • CAST 是一个函数。虽然为存储过程提供的参数不能起作用。引用规范:“提供的值必须是常量或变量。您不能将函数名称指定为参数值。”因此,您需要创建一个变量才能在 proc 中使用。
    • 这是一种使日期到字符串的转换更加紧凑的方法:DECLARE @strStart_Orig VARCHAR(30) = CAST(@strStart_Orig AS VARCHAR)
    【解决方案2】:

    FORMATMESSAGE 的文档说“有关错误消息中允许的占位符和编辑过程的更多信息,请参阅RAISERROR (Transact-SQL)。”这似乎真的意味着 RAISERROR 应该与 FORMATMESSAGE 以相同的方式工作。

    由于您可以在 FORMATMESSAGE 的参数中使用 CONVERT(但不能使用 CAST),如果暗示为真,那么您可以在 RAISERROR 的参数中使用 CONVERT,这将允许一个甜美而优雅的单行。

    但 SQL Server 无法正常工作(如您所愿)。但是,至少它可以简单一点:你只需要声明一个变量,而不是两个:

    DECLARE @ErrorMessage NVARCHAR(1000);
    SET @ErrorMessage= FORMATMESSAGE('SPName: InsertUpdateLiquidityDateRule:  Start Date: %s cannot  be greater than End Date %s',
        CONVERT (VARCHAR(30), @EffectiveStartDate, 23),
        CONVERT (VARCHAR(30), @EffectiveEndDate, 23)
        );
    
    RAISERROR (@ErrorMessage, 11, 1);
    

    (SQL Server 2016 SP2-CU12)

    Erland Sommarskog(自 2001 年以来的 SQL Server MVP)很好地总结了here:“我感觉 SQL Server 的设计目的是尽可能地让人困惑”。并且“如果你在某个时候跑[原文如此]为门口尖叫甲骨文,回来吧,一切都被原谅了,我不能怪你”。

    【讨论】:

      【解决方案3】:

      只是想帮忙,这是另一个例子。 我在 BEGIN TRY 之后把它放在 BEGIN CATCH 语句中。

      注意:这与使用 if 语句非常相似。

      BEGIN TRY
      --Do something.
      END TRY 
      
      BEGIN CATCH
          --Else on error do this.
          PRINT 'Problem found!!! ' 
      
          -- Whoops, there was an error
          -- Raise an error with the details of the exception
          DECLARE @ErrMsg nvarchar(4000), 
                  @ErrSeverity int, 
                  @ErrLineNum int
      
          SELECT @ErrMsg = ERROR_MESSAGE(), 
                 @ErrSeverity = ERROR_SEVERITY(), 
                 @ErrLineNum = ERROR_LINE()
      
          RAISERROR(@ErrMsg, @ErrSeverity, 1, @ErrLineNum)
      
      END CATCH
      

      【讨论】:

      • 这是对另一个问题的回答,但不是对本页问题的回答:)
      猜你喜欢
      • 2021-04-16
      • 2016-03-15
      • 2012-10-21
      • 1970-01-01
      • 1970-01-01
      • 2015-04-15
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多