【问题标题】:The conversion of the nvarchar value overflowed an int column in SQLSQL中nvarchar值的转换溢出了一个int列
【发布时间】:2016-12-03 17:38:53
【问题描述】:

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

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 的所有路径都必须返回 same datatype ,因为你没有这样做(一旦返回int,一次是nvarchar(50)),则 SQL Server 会将其中一个返回值转换为具有更高优先级的数据类型。由于int 的优先级高于nvarchar,因此具有超长值的nvarchar 字符串将转换为int - 并在此过程中失败。
  • 我使用的是sql server

标签: sql sql-server database


【解决方案1】:

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

由于您没有这样做(一旦您返回 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)

如果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)

您不需要在 ISNULL 中使用 CAST 的值 - 您需要在 ELSE 分支中为 CASE 转换 返回值。 ..

【讨论】:

  • 我理解了你的说法,我尝试将两个时间都转换为 Varchar,如下所示 DistRawProdIdentifier =(CASE ISNULL(CAST(dist.RawProductIdentifier as VARCHAR(50)), 0) WHEN 0 then CAST(tm. TranslationCriteria2 as VARCHAR(50)) else 0 end),但结果相同。如果您有任何建议,请更新。
  • 感谢@marc_s,但我使用的是 sql server 2005。请提出任何替代解决方案
  • 升级!! SQL Server 2005 已死 - 它已脱离主流扩展支持 - 升级,以免落后!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
相关资源
最近更新 更多