如何获取更详细的错误消息 - SQL操作数类型冲突

时间:2018-02-20 21:36:35

标签: sql sql-server

我正在运行一个简单的表联合,例如

SELECT foo, bar, ... FROM dbo.a 
UNION ALL 
SELECT foo, bar, ... FROM dbo.b

但它会导致错误:

  

Msg 206,Level 16,State 2,Line 45

     

操作数类型碰撞:float与日期不兼容

这两个表都有相同的列。

除了使用试验和错误之外,有没有办法调试或检查代码,以便知道哪些列导致了这个错误?

2 个答案:

答案 0 :(得分:2)

根据列名加入两个表的列元数据,并查找数据类型的差异。

SELECT  a.COLUMN_NAME, a.DATA_TYPE, b.DATA_TYPE
  FROM  INFORMATION_SCHEMA.COLUMNS AS a
  JOIN  INFORMATION_SCHEMA.COLUMNS AS b
    ON a.COLUMN_NAME = b.COLUMN_NAME
  WHERE a.TABLE_NAME = 'a'
        AND b.TABLE_NAME = 'b'
        AND a.DATA_TYPE <> b.DATA_TYPE

您的不匹配列应列在结果中。任何其他结果也值得一看。

答案 1 :(得分:1)

我对SQL Server的体验是,在创建UNION查询时,它会根据第一个查询中的内容决定输出列的数据类型。也许dbo.a和dbo.b中的所有列都具有相同的名称,但似乎它们中的一对具有不同的数据类型 - 在dbo.a中它将是某种DATE数据类型,并且在dbo.b中它将是某种INT数据类型。那么去看看dbo.a的数据类型 - 任何DATE,请看看dbo.b上的匹配列是什么。

确定哪些列不匹配后,您可以弄清楚如何继续 - 从查询中删除该列对,或将日期列从dbo.a CAST转换为其他数据类型,或者从dbo.b CAST int列在确定问题后,进入DATE,或任何分析适当的东西。