nvarchar值的转换溢出了SQL中的int列

时间:2016-12-03 08:58:41

标签: sql sql-server database

以前我使用的是自动生成的临时表,但在一种情况下我遇到了这个错误:

  

nvarchar值的转换' 182681000422'溢出了一个int列

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

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)

1 个答案:

答案 0 :(得分:3)

CASE表达式存在问题:CASE的所有路径都必须返回相同的数据类型(因为CASE是一个返回<的表达式strong>一个给定数据类型的单个原子值。

由于您没有这样做(一旦您返回int,一旦您拥有nvarchar(50)),那么SQL Server会将其中一个返回值转换为更高优先级的数据类型(有关详细信息,请参阅MSDN on Data Type Precedence)。

由于int的优先级高于nvarchar,因此具有超长值的nvarchar字符串将转换为int - 并且在此过程中失败。

根据您正在使用的SQL Server的版本,您可以使用TRY_CAST功能(在SQL Server中引入 2012 ):

SELECT   
    TRY_CAST('182681000422' AS INT)

如果NULL失败(不是错误消息),将返回CAST

更新,因为您使用的是SQL Server 2005 ,您可能希望使用BIGINT(而不是INT)哪个能够保存该值,或者在两种情况下都从VARCHAR(50)表达式返回CASE - 如下所示:

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

您不需要CAST ISNULL中您使用的价值 - 您需要为{{转换返回值 1}}在您的CASE分支......