【问题标题】:Error converting nvarchar to int during INSERT在 INSERT 期间将 nvarchar 转换为 int 时出错
【发布时间】:2014-02-01 12:48:49
【问题描述】:

我正在尝试运行以下命令:

INSERT INTO dbo.[PM10100] (VCHRNMBR,CRDTAMNT,DEBITAMT,DSTINDX,...) 
SELECT VCHNMBR,CRDTAMNT,DEBAMNT,CONVERT(int,DSTINDX),...
FROM dbo.[rahmani]

目标表中的DSTINDXint 列(非空)

我收到以下错误消息:

消息 245,第 16 级,状态 1,第 1 行
将 nvarchar 值“G-PI100-5405-0000-UR”转换为数据类型 int 时转换失败。

错误是引用列DSTINDX 中的值'G-PI100-5405-0000-UR'

我知道这是因为它的 nvarchar 试图转换为 int,关于如何在上述声明中更正此问题的任何想法?

【问题讨论】:

  • 除非我遗漏了什么,否则问题是值 'G-PI100-5405-0000-UR' 不是一个有效的整数,因此会出现错误。
  • 线索在您尝试将'G-PI100-5405-0000-UR' 插入INT 列的错误消息中。失败了。您的 select 或 insert 语句中的顺序可能有误。
  • 您希望它如何更正?将DSTINDX 的类型更改为nvarchar,将数据更改为int(这将意味着数据丢失),或者以某种方式将数据拆分为多个列以便可以插入和保留(排序)?
  • 我无法更改目标表@alroc 中的类型。我不想破坏数据丢失。我最初尝试将包导入到表中,并意识到这是错误。然后我将它导入到一个创建的表中,并希望在其中进行选择,这样我就可以在该数据集连接到的用户界面上看到数据的结果。
  • 我可以使用 TRIM 或 SUBSTRING 将值削减到 dbo.PM10100 表中的列需要的值吗?

标签: sql-server sql-server-2008 sql-insert type-conversion


【解决方案1】:

您明确表示:CONVERT(int,DSTINDX)

你为什么要这样做? source 显然是一个字符串列,因为它至少有一个字符串值(这是错误的来源)。

所以,您需要:

  1. 更改目标数据类型以匹配源,并停止执行转换
  2. 使用CASE 表达式保留这些值NULL
  3. 完全过滤掉这些行

2 和 3 的示例:

CREATE TABLE dbo.flung(id INT, DSTINDX VARCHAR(32));

INSERT dbo.flung VALUES(1,'1'),(2,'2'),(3,'G-PI100-5405-0000-UR');

SELECT id, DSTINDX = CASE
  WHEN DSTINDX NOT LIKE '%[^0-9]%' THEN DSTINDX END
FROM dbo.flung;

SELECT id, DSTINDX FROM dbo.flung WHERE DSTINDX NOT LIKE '%[^0-9]%';

如果您需要提取字符串列的子字符串并将其转换为INT,则需要比CONVERT(INT 做得更好 - SQL Server 不知道您该字符串的哪些部分' 之后,您将不得不构造一个定义明确的表达式来提取该信息。

【讨论】:

    猜你喜欢
    • 2012-08-16
    • 1970-01-01
    • 2021-01-17
    • 2015-03-14
    • 2015-12-24
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 2017-04-08
    相关资源
    最近更新 更多