我有一个带有NTEXT类型字段的表,它存储许多类型的值,其中包括文件大小。我正在尝试对记录列表运行查询并添加文件大小,但遇到了这个令人困惑的问题。
由于 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 时转换失败”
SELECT CONVERT(INT, CONVERT(VARCHAR, FileSize))
FROM dbo.myTable
WHERE ID = 111
我完全迷失了,有什么想法可能导致这种情况吗?
最佳答案
您无法控制 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'
这样的愚蠢废话。
关于sql-server - T-SQL : Converting NTEXT to VARCHAR to INT/BIGINT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14815760/