T-SQL:将NTEXT转换为VARCHAR到INT / BIGINT

时间:2013-02-11 15:55:06

标签: sql-server tsql varchar bigint ntext

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

由于 NTEXT 无法直接/隐式转换为 INT BIGINT ,我首先将其转换为 VARCHAR 然后我试图将它转换为INT或BIGINT。一切顺利,直到我尝试将 VARCHAR 值转换为 INT BIGINT

以下是我的查询和结果:

首先我尝试以下操作,显示没有问题,输出为 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 ”< / p>

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

我完全迷失了,可能导致这种情况的任何想法?

1 个答案:

答案 0 :(得分: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'列中留下愚蠢的废话。