2016-12-03 27 views
0

溢出int列以前我是使用自动生成的临时表,但在一个场景中,我得到这个错误:将nvarchar的值的转换在SQL

The conversion of the nvarchar value '182681000422' overflowed an int column

所以我创建了一个临时表,我定义的每个列中手动这样

Begin 
    Drop Table #tmpSTDistData 
End 

create table #tmpSTDistData 
(
    DistRawProdIdentifier Varchar(50) 
) 

如果在表1 RawProductIdentifier(数据类型int)的值是NULL它将从表2得到其值为TranslationCriteria2(数据类型varchar这里)。我仍然得到同样的错误。

INSERT INTO #tmpSTDistData 
    SELECT 
     DistRawProdIdentifier = (CASE ISNULL(dist.RawProductIdentifier, 0) 
            WHEN 0 
             THEN CAST(tm.TranslationCriteria2 as NVARCHAR(50)) 
             ELSE 0 
           END) 
+0

你必须用'CASE'表达了一个问题:所有的路径' CASE'必须返回**相同的数据类型**,因为你没有做(一旦返回'int',一旦一个'nvarchar(50)'),那么SQL Server会将其中一个返回值转换为具有更高优先级的数据类型。由于'int'的优先级高于'nvarchar',所以'nvarchar'的字符串会被转换为'int',并且会失败。 –

+0

我正在使用SQL服务器 –

回答

2

你必须与CASE表达了一个问题:CASE的所有路径必须返回相同的数据类型(因为CASE是返回一个单个的原子值一个给定数据类型的的表达)。

既然你不这样做,(一旦你返回一个int,一旦你有一个nvarchar(50)),则SQL Server将返回一个值转换为与更高的优先级的数据类型(见MSDN on Data Type Precedence为细节)。

由于int具有更高的优先级比nvarchar,你nvarchar串超长值将被转换为int - 并在此过程失败。

SELECT 
    TRY_CAST('182681000422' AS INT) 

将返回一个NULL,如果:

根据什么您正在使用的SQL Server版本,您可能能够使用TRY_CAST功能(在SQL Server 2012 介绍)在CAST失败(不是错误消息)

更新:,因为你使用SQL Server 2005 ,您可能希望用BIGINT(而不是INT),这将能够保持该值,或然后从CASE表达在这两种情况下返回VARCHAR(50) - 这样的:

DistRawProdIdentifier = 
    (CASE ISNULL(dist.RawProductIdentifier, 0) 
     WHEN 0 
      THEN CAST(tm.TranslationCriteria2 AS VARCHAR(50)) 
      ELSE CAST(0 AS VARCHAR(50)) 
    END) 

你不需要到CAST你使用在ISNULL价值 - 你需要转换返回值在您ELSE分支CASE ...

+0

我理解你的说法,我试图将时间都转换为Varchar,如下所示 DistRawProdIdentifier =(CASE ISNULL(CAST(dist。RawProductIdentifier as VARCHAR(50)),0)WHEN 0 then CAST(tm.TranslationCriteria2 as VARCHAR(50))else 0 end), 但是同样的结果。如果您有任何建议,请更新。 –

+0

谢谢@marc_s,但我使用的是sql server 2005.请建议任何备用解决方案 –

+1

**升级!! ** SQL Server 2005已经死了 - 它不再支持主流*和*扩展支持 - 升级,让您不会被遗弃背后! –