将datetime转为date时遇Msg206类型冲突错误,求SQL解决方法
解决SQL中操作数类型冲突(int与date不兼容)的问题
首先,咱们来拆解这个Msg 206错误的核心原因:CASE表达式的所有分支必须返回兼容的数据类型,你的原写法里,嵌套子查询的类型推断出现了问题,导致SQL Server无法确定CASE的统一返回类型,进而抛出了int与date不兼容的错误。另外,你在子查询里重复判断t0.InvType是冗余的,还可能干扰类型推断。
修正方案1:改用LEFT JOIN关联表(更高效清晰)
这种方式避免了嵌套子查询的类型不确定性,同时让逻辑更易读:
SELECT CASE WHEN t0.InvType = 13 THEN CAST(oinv.DocDate AS DATE) WHEN t0.InvType = 18 THEN CAST(opch.DocDate AS DATE) WHEN t0.InvType = 19 THEN CAST(orpc.DocDate AS DATE) WHEN t0.InvType = 204 THEN CAST(your_table_204.DocDate AS DATE) -- 替换为204对应的表名 ELSE NULL -- 明确ELSE分支,确保类型统一 END AS ConvertedDocDate FROM 你的主表名 t0 -- 替换成你的实际主表名称 LEFT JOIN OINV oinv ON t0.DocEntry = oinv.DocEntry AND t0.InvType = 13 LEFT JOIN OPCH opch ON t0.DocEntry = opch.DocEntry AND t0.InvType = 18 LEFT JOIN ORPC orpc ON t0.DocEntry = orpc.DocEntry AND t0.InvType = 19 LEFT JOIN your_table_204 ON t0.DocEntry = your_table_204.DocEntry AND t0.InvType = 204 -- 补充204对应的关联
修正方案2:优化原有的CASE子查询写法
如果你更倾向于保留子查询的方式,需要确保每个分支的子查询只返回单行,并且统一返回类型:
SELECT CASE WHEN t0.InvType = 13 THEN (SELECT CAST(DocDate AS DATE) FROM OINV WHERE DocEntry = t0.DocEntry) WHEN t0.InvType = 18 THEN (SELECT CAST(DocDate AS DATE) FROM OPCH WHERE DocEntry = t0.DocEntry) WHEN t0.InvType = 19 THEN (SELECT CAST(DocDate AS DATE) FROM ORPC WHERE DocEntry = t0.DocEntry) WHEN t0.InvType = 204 THEN (SELECT CAST(DocDate AS DATE) FROM your_table_204 WHERE DocEntry = t0.DocEntry) ELSE NULL -- 必须加上ELSE,确保所有分支返回类型一致 END AS ConvertedDocDate FROM 你的主表名 t0
关键注意点
- 类型统一:CASE的所有分支(包括ELSE)必须返回相同或兼容的类型,这里我们统一返回
DATE或NULL(NULL会继承DATE的类型)。 - 避免冗余判断:原写法里子查询重复判断
t0.InvType,CASE已经做了这个判断,子查询只需要匹配DocEntry即可,减少不必要的计算。 - 类型匹配:如果
t0.InvType是INT类型,就用数字(比如13)而不是字符串('13')进行比较,避免隐式转换带来的潜在问题。
内容的提问来源于stack exchange,提问作者shiela
相关产品推荐
相关产品推荐

