NVARCHAR值的转换溢出了SQL中的INT列



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

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)

您对CASE表达式有问题:CASE的所有路径都必须返回相同的数据类型(因为CASE是返回的表达式,一个给定数据类型的原子值)。

由于您不这样做(一旦您返回了int,一旦拥有nvarchar(50)),则SQL Server将使用更高优先级将返回值之一转换为数据类型(有关详细信息,请参见数据类型优先级的MSDN)。

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

取决于您正在使用的SQL Server的版本,您可以使用TRY_CAST函数(在SQL Server 2012 中介绍):

SELECT   
    TRY_CAST('182681000422' AS INT)

如果CAST失败(不是错误消息)

,它将返回NULL

更新:由于您使用的是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施放返回值 ...

最新更新