特定列 -- 将数据类型 nvarchar 转换为 bigint 时出错
Posted
技术标签:
【中文标题】特定列 -- 将数据类型 nvarchar 转换为 bigint 时出错【英文标题】:Specific column -- Error converting data type nvarchar to bigint 【发布时间】:2017-03-22 12:41:51 【问题描述】:这是 T-SQL 的一部分。我遇到了错误。谁能指导我。问题是因为 value 列是 nvarchar 数据类型
SELECT RuleID, SourceID, DataFileID, ChildCount, DP_State
FROM
(SELECT DP_State.RuleID, CAST(DP_State.SourceID AS VARCHAR(20)) AS SourceID, CAST(DP_State.DataFileID AS VARCHAR(20)) AS DataFileID, ChildCount, DP_State
FROM (
SELECT RuleID ,
RuleResultID ,
CASE WHEN ISNUMERIC(ISNULL([ResultValue], 0)) = 1 THEN
CAST(ISNULL([Value], 0) AS BIGINT)
ELSE
-1
END AS ChildCount,
我得到的错误:
【问题讨论】:
ISNUMERIC()
is unreliable, SELECT ISNUMERIC(ISNULL([ResultValue], 0)), ResultValue
看看哪里有意外1
嗨@AlexK。,我已经执行了 SELECT ISNUMERIC(ISNULL([ResultValue], 0)), ResultValue 并且列中有很多 1 和 ResultValue。
您可以使用 TRY_CAST() 而不是 CAST() 来查看在哪里获得 NULL VALUE(这是 TRY_CAST 不能转换的唯一值)。
查看我评论中的链接,ISNUMERIC
认为像 '.'
这样的值 是 数字,但将其转换为数字类型将失败,并出现您遇到的错误。
@AlexK.,没错,ISNUMERIC 认为 +- 也是数字
【参考方案1】:
如果您使用的是 SQL Server 2012 或更高版本,请尝试此操作
SELECT RuleID,
SourceID,
DataFileID,
ChildCount,
DP_State
FROM (
SELECT DP_State.RuleID,
CAST(DP_State.SourceID AS VARCHAR(20)) AS SourceID,
CAST(DP_State.DataFileID AS VARCHAR(20)) AS DataFileID,
ChildCount,
DP_State
FROM (
SELECT RuleID,
RuleResultID,
CASE
WHEN TRY_CONVERT(INT, ISNULL([ResultValue],0)) IS NOT NULL
THEN CAST(ISNULL([Value], 0) AS BIGINT)
ELSE - 1
END AS ChildCount,
)
)
【讨论】:
@感谢您的帮助。它解决了我的问题。 很高兴我能提供帮助。@SQLBoy【参考方案2】:通过首先检查[value]
和0
中的0
,您正在隐式转换为整数。只有在那之后您才转换为整数,而是尝试以下操作:
根据字符串计算:
CAST(ISNULL([Value], '0') AS BIGINT)
或者先转换成整数:
ISNULL(CAST([Value] AS BIGINT), 0)
【讨论】:
感谢您的回复@Aquillo,它帮助我意识到我的问题。以上是关于特定列 -- 将数据类型 nvarchar 转换为 bigint 时出错的主要内容,如果未能解决你的问题,请参考以下文章
SQL 异常:将 nvarchar 值“[anyvalue]”转换为数据类型 int 时转换失败