sql-server - T-SQL : Converting NTEXT to VARCHAR to INT/BIGINT

标签 sql-server tsql varchar bigint ntext

我有一个带有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

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

最佳答案

您无法控制 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/

相关文章:

sql - 如何在 sql server 2008 的存储过程中使用 if 比较两个字符串?

sql - 在 SQL 中查找某人的年龄

sql - 存储过程返回一个字符串?

MySQL:在带逗号的 varchar 上使用 sum?

asp.net - 大型站点不将 MySQL 与 ASP.NET 一起使用的原因是什么?

c# - 按不同方向的日期排序

sql - 在 SQL 字段中为每个 JSON 元素选择一行/将 JSON 字段转换为行

带日期值的sql case语句

mysql - 如何在不使用子查询的情况下将行转换为基于列的类型过滤器

mysql - mysql上需要大于20位的整数怎么办?