【问题标题】:I am debugging a stored procedure and trying to understand a Convert statement with Case我正在调试一个存储过程并尝试使用 Case 来理解 Convert 语句
【发布时间】:2017-10-23 23:21:29
【问题描述】:
SELECT AcquistionDate = CONVERT(NVARCHAR,
                        CASE 
                           WHEN D.CalendarDate NOT IN ('01/01/1900','12/31/9999') 
                              THEN D.CalendarDate 
                           WHEN ac.FirstAccountOpenDate NOT IN ('01/01/1900', '12/31/9999')  
                              THEN ac.FirstAccountOpenDate 
                        END, 126) + 'Z 
from TABLE;

我收到一个错误

消息 8114,第 16 级,状态 5,第 1 行
将数据类型 varchar 转换为 bigint 时出错

【问题讨论】:

  • CalendarDate 和 FirstAccountOpenDate 列的数据类型是什么?它们是实际的日期时间字段吗?此外,您的 SQL 无效,看起来像是在复制/粘贴中被截断了。
  • 这个存储过程有效吗?当您说调试存储过程时,您是继承了这段代码还是编写了它?如果你继承了它,我会说找出你真正想要返回的东西并从头开始重写它。如果你是自己写的,那么请告诉我们你到底想在这里做什么。
  • 我终于在SP中发现了不同行的问题。我被第 1 行的错误消息误导了。我在 SP 中有多个子查询,因为我使用子查询代替 SP 中的临时表。基本上是测试者的东西:)

标签: sql-server tsql type-conversion case sql-convert


【解决方案1】:

CONVERT(NVARCHAR....) 获取一个日期并将其转换为格式为 126 的 NVARCHAR 或 yyyy-mm-ddThh:mi:ss.mmm

但是你有+'Z from table 我会假设这是一个复制粘贴错误并且单引号不应该存在并且它实际上是+ Z from Table 在这种情况下我会假设Z 是@987654326 @。这意味着您正在尝试将NVARCHAR 添加到BIGINT,这意味着首先尝试将NVARCHAR 转换为BIGINT,这将失败,因为它是日期的字符串表示而不是数字。

另一个可能在不了解您的代码或数据库结构的情况下是CASE 表达式中的一个日期字段实际上是BIGINT,当您将它与字符串的日期表示进行比较时,对话失败了。

但我确实同意 Chris Berger 的评论,即这看起来应该写得非常不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 2014-03-08
    • 1970-01-01
    • 2019-07-23
    • 2012-02-21
    • 2010-10-29
    • 1970-01-01
    相关资源
    最近更新 更多