AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 28040
Accepted
hexparrot
hexparrot
Asked: 2012-11-02 14:27:16 +0800 CST2012-11-02 14:27:16 +0800 CST 2012-11-02 14:27:16 +0800 CST

获取“将 nvarchar 值转换为数据类型 int 时转换失败。”

  • 772

我有一个 SQL Server 表配对邮政编码和纬度/经度几何,如下所示

ID  ZIP5    geom
1   356HH   0xE610000001044E00....FFFFFFFF0000000003ID
2   35677   0xE6100000010404000000068....000003

我遇到的问题是,由于 ZIP5 字段包含字符,我似乎无法从一种类型转换为另一种类型。

我尝试过的是一种方法,其中我只提取完全整数友好的记录:

SELECT
    zip,
    coordinates
FROM (
    SELECT
        CONVERT(int, [ZIP5]) AS zip,
        CONVERT(varchar(max), geom) AS coordinates
    FROM 
        [SpatialData].[dbo].[zip5]
    WHERE
        ISNUMERIC([ZIP5]) = 1
) AS t1
WHERE
    zip >= 85000 AND
    zip < 86000

我假设由于子查询返回了一个INT类型,所以在外部执行普通比较运算符绝对没有问题WHERE。执行此查询时出现以下错误:

消息 245,级别 16,状态 1,行 1
将 nvarchar 值“356HH”转换为数据类型 int 时转换失败。

省略WHEREexternal ,我在 ZIP5 列中得到一个包含 100% 整数的完整结果集。使用 external WHERE,它似乎超越了前一个CONVERT并且转换失败。

作为一些额外的说明:

  1. 这个查询的性质是好的,没有得到有字母的行。
  2. 将 HH(或任何其他双字符对)替换为数字零也是完全可以的(但是尝试过REPLACE但STUFF无济于事)
  3. 我已经尝试过 TRY/CATCH,但它在语句中似乎不起作用WHERE——当更广泛地捕获整个查询时,try/catch 最终将返回一个空集。

如果不制作临时表 - 表变量,哪种方法是最好的解决方法?

sql-server cast
  • 2 2 个回答
  • 30443 Views

2 个回答

  • Voted
  1. Best Answer
    孔夫子
    2012-11-02T20:14:04+08:002012-11-02T20:14:04+08:00

    以这种方式编写您的查询。例如,它包括一个更好的整数测试和转储 ISNUMERIC,它为“-.”返回 1。

    SELECT
        zip,
        coordinates
    FROM (
        SELECT
            CASE WHEN ZIP5>'' AND NOT ZIP5 LIKE '%[^0-9]%' THEN
                CONVERT(int, [ZIP5]) END zip,
            CONVERT(varchar(max), geom) AS coordinates
        FROM 
            [SpatialData].[dbo].[zip5]
        WHERE
            ZIP5>'' AND NOT ZIP5 LIKE '%[^0-9]%'
    ) AS t1
    WHERE
        zip >= 85000 AND
        zip < 86000
    

    看到这个连接项目

    SQL Server 可以按照它决定优化的顺序自由地评估 WHERE/SELECT 子句。未物化的视图或派生表可以很容易地从外部查询扩展到。

    SQL Server 正在编译的实际上是一个看起来像这样的查询

    SELECT
        CONVERT(int, [ZIP5]) AS zip,
        CONVERT(varchar(max), geom) AS coordinates
    FROM 
        [SpatialData].[dbo].[zip5]
    WHERE
        ISNUMERIC([ZIP5]) = 1
        AND CONVERT(int, [ZIP5]) >= 85000
        AND CONVERT(int, [ZIP5]) < 86000
    

    你可以检查你原来的查询计划,但我从结构上的猜测是 WHERE 子句使用了CONVERT(int, [ZIP5])两次表达式,因此在检索过程中简化表达式的解析(计算到结果)是有意义的表中的数据。这会将 SELECT 子句的处理放在 WHERE 之前,因此您ISNUMERIC() = 1永远没有机会过滤坏鸡蛋。

    它是by-design。

    • 2
  2. Kenneth Fisher
    2016-04-26T10:13:24+08:002016-04-26T10:13:24+08:00

    这并不是对您问题的严格回答,但我会从您的问题中退后一步,思考您要解决的问题。

    为什么要将邮政编码存储为整数?根据我的经验,没有充分的理由将您的邮政编码存储为字符串以外的任何内容。

    您说您可以忽略其中带有字母的值,但即使是严格的数字拉链也不总是有效。例如,02345 将变为 2345。除此之外,如果您决定添加外部数据整数将根本不起作用,您将需要做大量工作来修复它。例如,加拿大邮政编码如下所示K1A 0B1。显然,除了字符串数据类型之外,它不适合任何东西。更不用说它不适合 CHAR(5),这是邮政编码的另一个常见数据类型错误。

    最后,将它们存储为整数没有任何好处。您不会对它们进行总计、平均或执行标准偏差,对吗?那么,为什么还要麻烦将它们存储为数字呢?int 将比 char(5) 占用更少的空间(或者更好的是 varchar(10)),但它节省的空间非常小,并且不能弥补不良数据。

    • 2

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve