以前我使用的是自动生成的临时表,但在一种情况下我遇到了这个错误:
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)
答案 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
分支......