Bra*_*rad 1 sql t-sql sql-server
为什么会失败:
DECLARE @DATE VARCHAR(50) = 'dasf'
SELECT CASE WHEN ISDATE(@DATE) = 1 THEN CONVERT(date,@DATE) ELSE @DATE END
Run Code Online (Sandbox Code Playgroud)
消息241,级别16,状态1,行2转换在从字符串转换日期和/或时间时失败.
为什么它明确导致ISDATE(@DATE)= 1评估为false时尝试将dasf转换为日期...
如果我做:
SELECT ISDATE(@DATE)
Run Code Online (Sandbox Code Playgroud)
返回值为0.
CASE返回单一类型.在这种情况下,类型是Date,可以从THEN子句中找到.它隐式地将ELSE子句结果转换为Date以匹配.
您必须选择CASE返回的单一类型.它不能用于返回有时Date和有时varchar.
来自MSDN:http: //msdn.microsoft.com/en-us/library/ms181765.aspx
退货类型
返回result_expressions中的类型集和可选的else_result_expression中的最高优先级类型.有关更多信息,请参阅数据类型优先级(Transact-SQL).
然后关注该链接:http://msdn.microsoft.com/en-us/library/ms190309.aspx
8)约会
27)varchar
目前还不清楚你想要什么,所以很难提供替代方案(我不知道CASE是否是更大的查询或脚本的一部分),但这里有几件你可以做的事情:
-- choose a single return type per CASE expression
SELECT
CASE
WHEN IsDate(@Date) = 1
THEN convert(date, @Date)
ELSE null
END as [Date],
CASE
WHEN IsDate(@Date) = 1
THEN null
ELSE @Date
END as [VarChar]
--use control flow to select what you want.
IF IsDate(@Date) = 1
THEN
SELECT convert(date, @Date)
ELSE
SELECT @Date
Run Code Online (Sandbox Code Playgroud)