【问题标题】:SQL Server - Error converting data type nvarchar to bigintSQL Server - 将数据类型 nvarchar 转换为 bigint 时出错
【发布时间】:2017-05-06 23:42:28
【问题描述】:

当我使用SELECT * 运行以下查询时,我收到错误消息:

[S0005][8114] 将数据类型 nvarchar 转换为 bigint 时出错。

SELECT * FROM (
                SELECT * , ROW_NUMBER() OVER (ORDER BY CAST(id as BIGINT)) AS RowNum
                FROM users
            ) AS users
            WHERE users.RowNum BETWEEN 0 AND 5 ;

当我仅使用 SELECT id , ROW_NUMBER() ... 运行此查询时,一切正常。

我的数据库如下所示:

此查询与id 列为NVARCHAR 的其他表一起运行良好

ID 列仅是数字,如果我将其转换为:CAST(id as NVARCHAR) 我得到同样的错误。

编辑:

我发现列 ID 值有问题

ID 46903836 ID 9100000004

小 id 没有前导零

【问题讨论】:

  • 如果 ID 已经是 BIGINT,则无需将 ID 转换为 BIGINT。如果它是NVARCHAR,你只需要转换它。如果您的ID 字段中有一个字母,因为它是NVARCHAR,那么您将无法转换为数字。
  • 嗯,错误信息很清楚。您的 varchar 中有一个不是有效 bigint 的值。这就是为什么您应该始终使用正确的数据类型。
  • 如果您的图像 ID 是 BIGINT,为什么要将 ID 转换为 BIGINT?
  • 我感觉您做错了什么,而您向我们展示的并不是错误的实际原因。我认为一些细节在途中丢失了......你确定你没有连接到两个数据库并以不同的方式查询它们吗?请放心,您的查询没有错,是列中的数据或数据类型。
  • 除非 OP 正在试验窗口函数(总是鼓励),否则似乎还有很长的路要走 Select top 5 ... 按 ID 排序

标签: sql sql-server


【解决方案1】:

通常当我收到此错误时,是因为列的前面或末尾有空格。这是我的解决方法。

SELECT * FROM (
            SELECT * , ROW_NUMBER() OVER (ORDER BY CAST(LTRIM(RTRIM(id)) as BIGINT)) AS RowNum
            FROM users
        ) AS users
        WHERE users.RowNum BETWEEN 0 AND 5 ;

这将确保 ID 只是数字,我还假设 ID 没有任何字母字符。

【讨论】:

  • 尾随空格几乎没有重要的比较(where / have),尤其是转换。您有一个例子,其中一定数量的前导或尾随空格导致转换错误吗? span>
  • 我没有,但是当字符串中有空格时,我遇到了对数字数据类型的问题或将nvarchar或varchar转换为数字数据类型。 span>
  • 中间可能(它不会用修剪解决),但我从未见过导致或尾随原因。只是想知道,因为你的答案暗示了这个问题的因果关系。 span>
  • @ scsimon:只需尝试SELECT ISNUMERIC('2')然后在2.(\r\n)后再次尝试新行。第一个是真的,第二个是假的,同样会导致转换 span>时出错
  • @ hudelsing,这不是一个空间。这是一个回车/线饲料。方式不同。 span>
【解决方案2】:

您的ID 字段是BIGINT(您已经发布了表结构),这不会导致您的问题出现错误。

但是,由于CAST 没有用,您可以按如下方式重写您的查询:

SELECT * FROM (
    SELECT * , ROW_NUMBER() OVER (ORDER BY id) AS RowNum
    FROM users
) AS users
WHERE users.RowNum BETWEEN 0 AND 5 ;

【讨论】:

  • 虽然是真的,但它并不能解释在他发布的代码 sn-p 中几乎可以肯定不会发生的错误
  • 当我只做 SELECT * FROM ( SELECT id , ROW_NUMBER() OVER (ORDER BY id) AS RowNum FROM users ) AS users WHERE users.RowNum BETWEEN 0 AND 5;但我还需要其他列,如姓名、电子邮件等...
  • 如果您想要其他栏目,请发布您的完整请求。因为与您的问题查询相关的错误非常奇怪。
【解决方案3】:

您不需要转换您的 id 列,因为它已经在 bigint 数据类型中

【讨论】:

  • 但如果表中有其他列,例如姓名、电子邮件等。您将收到该错误。
猜你喜欢
  • 2012-09-25
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 2016-05-20
  • 2016-01-20
  • 1970-01-01
相关资源
最近更新 更多