代码之家  ›  专栏  ›  技术社区  ›  Sam

在联接之前未筛选数据

  •  2
  • Sam  · 技术社区  · 17 年前

    update  btd.dbo.tblpayroll
    set     empname = ( select  b.Legal_Name
                        from    ( SELECT    Legal_Name,
                                            Employee_ID
                                  FROM      Com.dbo.Workers
                                  WHERE     isnumeric(Employee_ID) = 1
                                ) b
                        where   b.Employee_ID = empnum
                                and b.Legal_name is not NULL
                      )
    where   empname is NULL
    

    Msg 245,16级,状态1,第1行 将varchar值“N0007”转换为数据类型int时,转换失败。表别名b实际上是一个视图。

    值“N0007”位于Workers表中。我不明白为什么它没有从正在加入的结果中过滤出来。

    编辑:

    实际上,别名返回正确的行-因此isNumeric正在执行此任务。

    4 回复  |  直到 17 年前
        1
  •  2
  •   tvanfosson    17 年前

    update  btd.dbo.tblpayroll
    set     empname = ( select Legal_Name
                        from Com.dbo.Workers
                        where  isnumeric(Employee_ID) = 1
                               and convert(varchar,Employee_ID)
                                 = convert(varchar,empnum) 
                               and Legal_name is not NULL)
    where   empname is NULL
    

        3
  •  0
  •   SeaDrive    17 年前

    最明显的是强制比较顺序,可能是从只有数字Employee_id的视图中获取名称,而不是从完整的Workers表中获取名称。

        4
  •  0
  •   C B dkretz    8 年前

    也许N被认为是货币符号?您可以尝试将IsNumeric替换为

    LIKE REPLICATE('[0-9]',/*length of Employee_ID*/) 
    

    LIKE '[0-9]%' 
    

    如果字母不能在中间