在SQL中循环CASE WHEN和REPLACE语句

时间:2017-10-16 11:05:09

标签: sql sql-server tsql

为多个基本问题道歉 - 我对SQL非常陌生并仍在尝试解决问题。

我想将登台表中的记录插入数据库中的另一个表,同时使用'replace'函数删除源文件中的双引号,并将数据从nvarchar(登台表)转换为datetime2。我无法解决如何执行此操作:如果我在'replace'中循环'case when',如下所示,那么SQL无法识别我的数据并将其清空:

CASE WHEN ISDATE (REPLACE([Column1], '"', '')) = 1
    THEN CONVERT(datetime2, Column1, 103) 
                    ELSE null END

但是,如果我在'case'中循环我的'replace',如下所示,SQL会给我一条错误消息,说它无法将nvarchar转换为datetime2:

LTRIM(REPLACE([Column1], '"', '')
    ,CASE WHEN ISDATE(Column1) = 1 THEN CONVERT(datetime2, Column1, 103) 
                    ELSE null END

我需要使用什么顺序/语法才能实现此目的?数据字段的一个示例是: “16/10/2017”

它以nvarchar的形式上传到我的登台表 “16/10/2017”

我想把它作为datetime2移到我的table2中: 16/10/2017

2 个答案:

答案 0 :(得分:2)

而不是isdate(),请使用try_convert()

TRY_CONVERT(datetime2, LTRIM(REPLACE([Column1], '"', ''), 103) 

我认为你的困惑是你需要在转换之前进行字符串操作。为此,字符串操作需要是转换的参数。

答案 1 :(得分:1)

你做得对。问题是,convert需要没有" "的值,因此您的转换失败了。

试试这个:

select
CASE WHEN ISDATE (REPLACE([Column1], '"', '')) = 1
     THEN CONVERT(datetime2, (REPLACE([Column1], '"', '')), 103) 
     ELSE null END
from #tbl

更多详情:cast and convert doc