“将表达式转换为数据类型为nvarchar的算术溢出错误。”

问题描述 投票:0回答:2

我正在尝试对2个表之间的数据进行比较,在这里我需要将多个列作为组合键来获得唯一的标识符。我正在使用CTE,我拥有的代码是:

WITH SuburbDataTest AS (
  SELECT *
    ,  CAST(Address AS NVARCHAR(100))+' ' +CAST(LivingAddress AS NVARCHAR(2))
    + ' ' + CAST(StartDate AS NVARCHAR(11))+ ' ' +CAST(AddressTypeId AS NVARCHAR(1))
    + ' ' +CAST(SuburbId AS NVARCHAR(1))AS SuburbDataTestColumn
  FROM [mig].[ConsumerAddressMigration]
  WHERE SuburbId is NOT NULL
)
SELECT *
FROM SuburbDataTest staging
WHERE SuburbDataTestColumn IN (
  SELECT Address+' ' +CAST(LivingAddress AS NVARCHAR(2))+ ' '+CAST(StartDate AS NVARCHAR(11))
    + ' ' +CAST(AddressTypeId AS NVARCHAR(1))+ ' ' +CAST(SuburbId AS NVARCHAR(1)) AS SuburbDataTestColumn
  FROM [dbo].[tblConsumerAddress]
)

不幸的是我得到

将表达式转换为数据类型为nvarchar的算术溢出错误。

有什么想法吗?

sql sql-server overflow common-table-expression sqldatatypes
2个回答
0
投票

当您将数字转换为字符串时-字符串不够大,就会发生这种情况。我猜这是问题所在:

CAST(SuburbId AS NVARCHAR(1))

如果SuburbId大于9,则将产生错误。或者,就此而言,如果值是负数,您也会得到相同的错误。


0
投票

错误:

将表达式转换为数据类型为nvarchar的算术溢出错误

当人们试图以不足够的精度将数字转换为nvarchar时无法观察到该数字。

例如,如果我执行以下查询,我将得到错误。

declare @int int = 30 
select cast(@int as nvarchar(1)) 

enter image description here

在您的情况下,可能是CAST(AddressTypeId AS NVARCHAR(1))CAST(SuburbId AS NVARCHAR(1))导致了错误。您可以检查某些数据实际上是两位还是多位数字,或者是否为负数(如上述Gordon所述。)>

© www.soinside.com 2019 - 2024. All rights reserved.