将数据类型varchar转换为bigint时出错。使用更新时

时间:2018-11-04 14:46:05

标签: sql sql-server

我正在使用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;
  }

我尝试使用强制转换功能,但不起作用。有人可以告诉我我在做什么错吗?

1 个答案:

答案 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()

此外,我强烈建议您不要依赖隐式转换。始终明确进行转换。我花了许多时间来调试代码,以解决隐式转换引起的问题。