在INSERT期间将nvarchar转换为int时出错

时间:2014-01-13 16:58:13

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

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

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

DSTINDXint列(非空)

我收到以下错误消息:

  

Msg 245,Level 16,State 1,Line 1   
将nvarchar值'G-PI100-5405-0000-UR'转换为数据类型int时转换失败。

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

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

1 个答案:

答案 0 :(得分:1)

您明确地说:CONVERT(int,DSTINDX)

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

所以,你需要:

  1. 更改目标数据类型以匹配源,并停止执行转换
  2. 使用CASE表达式保留这些值NULL
  3. 完全过滤掉这些行
  4. 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不知道哪些部分您正在使用的那个字符串,并且您将不得不构建一个明确定义的表达式来提取该信息。