以前我使用的是自动生成的临时表,但是在一种情况下,我遇到了此错误:
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)。
由于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)
您不需要CAST
您在ISNULL
中使用的值 - 您需要在ELSE
分支中为CASE
施放返回值 ...