5

我有一个带有NTEXT类型字段的表,其中存储了许多类型的值,其中包括文件大小。我正在尝试对记录列表运行查询并添加文件大小,但我遇到了这个令人困惑的问题。

由于NTEXT不能直接/隐式转换为INTBIGINT,因此我先将其转换为VARCHAR,然后尝试将其转换为 INT 或 BIGINT。一切都很好,直到我尝试将VARCHAR值转换为INTBIGINT

这是我的查询和结果:

首先我尝试以下,显示没有问题,输出为61069(值仍为 ntext 类型)。

SELECT FileSize
FROM dbo.myTable
WHERE ID = 111

现在我将它转换/转换为 varchar,再一次,没问题。输出是61069(现在是 varchar 类型)。

SELECT CONVERT(VARCHAR, FileSize)
FROM dbo.myTable
WHERE ID = 111

最后,我尝试将 VARCHAR 值转换为 BIGINT,以便进行 SUM() 和其他计算,但这次我收到“将数据类型 varchar 转换为 bigint 时出错。 ”消息。

SELECT CONVERT(BIGINT, CONVERT(VARCHAR, FileSize))
FROM dbo.myTable
WHERE ID = 111

如果我尝试将其转换为 INT,则会收到“将 varchar 值 '7/1/2008 3:39:30 AM' 转换为数据类型 int 时转换失败

SELECT CONVERT(INT, CONVERT(VARCHAR, FileSize))
FROM dbo.myTable
WHERE ID = 111

我完全迷路了,有什么可能导致这种情况的想法吗?

4

1 回答 1

6

您无法控制 where 子句和转换的应用顺序。在某些情况下,SQL Server 将尝试对未通过过滤器的行执行转换——这一切都取决于计划。试试这个:

SELECT CASE WHEN ID = 111 THEN 
  CONVERT(INT, CONVERT(VARCHAR(12), FileSize))
  -- don't be lazy, size ------^^ is important
  END
FROM dbo.myTable
WHERE ID = 111;

还可以考虑使用整数列来存储整数。然后,您不会在FileSize列中出现愚蠢的废话,例如'7/1/2008 3:39:30 AM'.

于 2013-02-11T15:58:21.317 回答