我正在使用SQL Server。我正在尝试运行以下SQL脚本,但出现此错误:
将数据类型varchar转换为bigint时出错。
这是脚本:
private int readUserInput(String messageToUser) {
System.out.print("Enter " + messageToUser);
Scanner scan = new Scanner(System.in);
boolean validInput = false;
int res = 0;
do {
try {
validInput = scan.hasNextInt();
if (!validInput) {
throw new NotIntUserInputException();
}
res = scan.nextInt();
if (res < 1) {
validInput = false;
throw new NotPositiveIntUserInputException();
}
} catch (Exception e) {
System.out.print(e.getMessage());
scan.next();
}
} while (!validInput);
return res;
}
我尝试使用强制转换功能,但不起作用。有人可以告诉我我在做什么错吗?
答案 0 :(得分:2)
isnumeric()
并没有提供您想要的保护。使用try_convert()
进行比较:
with T as (
select sp.ProfileId, sp.ProfileHandle, sp.[Description]
from [SocialProfile] sp inner join
Entity e
on sp.EntityId = e.EntityId
where e.EntityStatusId not in (3, 4) and
sp.SocialProfileTypeId in (1, 2, 10) and
ISNUMERIC(sp.ProfileHandle) = 1 and -- you can leave it in
IsRemoved = 0
)
update T
set ProfileHandle = NULL
where try_convert(int, ProfileHandle) = ProfileId;
SQL Server具有“功能”,它将在其中重新排列查询中的条件。 CTE不会先执行,因此isnumeric()
不一定要在where
中进行转换之前运行。我认为这是一个错误。微软认为这是一项功能(因为它提供了更多的优化选项)。
查询中唯一可以保证的顺序是通过case
表达式。最简单的解决方法是try_convert()
。
此外,我强烈建议您不要依赖隐式转换。始终明确进行转换。我花了许多时间来调试代码,以解决隐式转换引起的问题。