T-SQL转换失败错误消息

时间:2011-10-21 18:16:10

标签: tsql

我收到以下错误:

Conversion failed when converting the varchar value '2010-01-10' to data type int.

在Management Studio的查询窗口中运行以下命令时:

SELECT * FROM (
SELECT CAST(group_id AS INT) AS qqq from view_jct_snapshot_group_items
) AS X
WHERE qqq = CAST(14290 AS INT)

但是,当我只运行查询的这一部分时,我得到的结果并没有错误:

SELECT CAST(group_id AS INT) AS qqq from view_jct_snapshot_group_items

与以下类似:

SELECT * FROM (
SELECT CAST(group_id AS INT) AS qqq from view_jct_snapshot_group_items
) AS X

发生了什么,如何在不收到错误的情况下使用where子句?

2 个答案:

答案 0 :(得分:1)

作为视图源数据的表格很可能在'2010-01-10'列中具有值group_id,并且这被视图本身中的过滤器排除。

视图是由查询优化器扩展的内联构造,看起来您的查询正在将过滤器推送到过滤器发生之前。

尝试

SELECT *
FROM   (SELECT CAST(CASE
                      WHEN group_id NOT LIKE '%[^0-9]%' THEN group_id
                    END AS INT) AS qqq
        FROM   view_jct_snapshot_group_items) AS X
WHERE  qqq = 14290  

答案 1 :(得分:0)

SELECT CAST(group_id AS INT) AS qqq from view_jct_snapshot_group_items 

这需要能够将视图中的所有值强制转换为int。显然,至少有一个值不是int。尝试将WHERE子句放在派生表中,而不是在它之外。

通常,在一个字段中存储不同数据类型的数据是个坏主意。这会导致编写查询时出现许多问题,并且需要您执行大量不必要的工作(在系统性能成本范围内)以将数据转换为正确的类型。就个人而言,我会重新审视你的设计,看看为什么整数和日期存储在同一个字段中。