【问题标题】:TRY CATCH on a CONVERT in a Select Statement在 Select 语句中的 CONVERT 上尝试 CATCH
【发布时间】:2010-10-29 13:51:24
【问题描述】:

是否可以在 SQL Selects 中使用 TRY CATCH 块?

例如类似这样的东西:

select 
   order, 
   CONVERT(DATETIME, orderDate)
from orders

处理这种情况的最佳方法是什么?

【问题讨论】:

  • 如果 IsDate 为真,那么您可以将其转换为日期时间。这就是 IsDate 的意义所在。
  • @JohnIdol:“标准”是什么意思。 ISO是一个标准的例子。 orderDate 有哪些不同的格式?
  • 抱歉 - 我弄糊涂了 - IsDate 没问题!

标签: sql tsql datetime try-catch


【解决方案1】:

我不知道 try-catch,但是在 SQL Server 中你有 ISDATE 函数并且可以在那里做类似的事情

CASE WHEN ISDATE(orderDate) = 1 THEN CONVERT(DateTime, orderDate) ELSE GETDATE() END

【讨论】:

  • 如果日期格式不同怎么办?
  • 我的日期字段是 char(23) 并且执行 ISDATE(datefield) = 1 不会返回任何字段。它们的格式是 yyyy-mm-dd hh:mi:ss.mmm,我猜 ISDATE 无法识别。
【解决方案2】:

你可以使用函数ISDATE():

SELECT ISDATE('11/13/2009')
SELECT ISDATE('13/11/2009')

【讨论】:

    【解决方案3】:

    在 SELECT 子句本身中,没有。

    您可以使用ISDATE() 测试日期

    select 
       order, 
       CASE WHEN ISDATE(orderDate) = 1 THEN CONVERT(DATETIME, orderDate) ELSE NULL END
    from orders
    

    【讨论】:

      【解决方案4】:

      我认为在 select 内不可能使用 try catch,但在使用存储过程时可以在外部使用。

      begin try
          select cast(strartnr as int) from table
      end try
      begin catch 
          select 10000 from table
      end catch
      

      【讨论】:

        【解决方案5】:

        在 MS SQL Server 2012 中,有一个新结构可以完全满足要求:

        
        SELECT 
            CASE WHEN TRY_CONVERT(float, 'test') IS NULL 
            THEN 'Cast failed'
            ELSE 'Cast succeeded'
        END AS Result;
            GO
        

        另见http://msdn.microsoft.com/en-us/library/hh230993.aspx

        【讨论】:

          猜你喜欢
          • 2012-05-22
          • 1970-01-01
          • 1970-01-01
          • 2015-09-13
          • 2010-10-30
          • 2014-12-22
          • 2016-03-05
          • 1970-01-01
          相关资源
          最近更新 更多