SQL Server查询,传递给LEFT或SUBSTRING函数的长度参数无效

SQL Server查询,传递给LEFT或SUBSTRING函数的长度参数无效,sql,sql-server,Sql,Sql Server,在查询中,我使用了几个子字符串、CHARINDEX、lent-SQL函数 我得到一个错误: 传递给LEFT或SUBSTRING函数的长度参数无效` 好的,我正试图找出哪些记录导致无法过滤它 在WHERE语句中,我尝试: WHERE ... and mt.id between 1 and 200 它失败了。好的,我尝试缩小范围,更改为: WHERE ... and mt.id between 1 and 100 它很好用。好的,尝试下一个范围: WHERE ... and mt.id betw

在查询中,我使用了几个子字符串、CHARINDEX、lent-SQL函数

我得到一个错误:

传递给LEFT或SUBSTRING函数的长度参数无效`

好的,我正试图找出哪些记录导致无法过滤它

在WHERE语句中,我尝试:

WHERE ...
and mt.id between 1 and 200
它失败了。好的,我尝试缩小范围,更改为:

WHERE ...
and mt.id between 1 and 100
它很好用。好的,尝试下一个范围:

WHERE ...
and mt.id between 100 and 200
而且它也很好用!不要出错。这会让我的大脑爆炸。 有什么想法吗

下面是我尝试运行的代码:

SELECT
  *
FROM [someTable] mt
  INNER JOIN persons p p.ID = mt.personID
  LEFT JOIN someTable2 pb 
    ON 
      SUBSTRING(pb.shortName, 0, CHARINDEX(' ', pb.shortName)) = mt.OSB 
       OR(
      SUBSTRING(mt.OSB, 0, CHARINDEX('/', mt.OSB)) 
    = SUBSTRING(pb.shortName, 0, CHARINDEX('/', pb.shortName)) 
     AND
      '0' + SUBSTRING(mt.OSB, CHARINDEX('/', mt.OSB) + 1, LEN(mt.OSB)) 
    = SUBSTRING(pb.shortName, CHARINDEX('/', pb.shortName) + 1,
     CHARINDEX(' ', pb.shortName) - CHARINDEX('/', pb.shortName) - 1))
WHERE mt.OSB IS NOT null AND mt.shet IS NOT NULL AND CHARINDEX('/', mt.OSB) > 0  
-- and mt.id between 1 and 200
-- and mt.id between 1 and 100
and mt.id between 100 and 200
order by mt.id

我不会担心射程。真正的问题是,您的一个子字符串调用试图获取比字段更多的字符

SQL Server不能保证以相同的顺序计算记录,因此当您使用1-200范围时,可能会验证其他一些记录,但这些记录不是结果集的一部分

例如,如果pb.shortName只有一个字符,下面的代码将导致问题:

SUBSTRING(pb.shortName, CHARINDEX('/', pb.shortName) + 1,
                CHARINDEX(' ', pb.shortName) - CHARINDEX('/', pb.shortName) - 1)
这将是一个问题,因为您依赖于字符串中的/和以及该字符串中的特定顺序


如果不知道应用程序/数据库的格式规则,则很难进一步帮助您。

在1到200之间,有一些记录使您的子字符串和charindex失败。请尝试注释/取消注释列并加入以达到该错误。不评论,mt.id介于1和200之间 使用与查询中相同的列(介于1和200之间)计算每个表,并查看记录截断的位置。 像


我用range来找出哪个记录是错误的。相同的ID范围在1-200之间时失败。当我将id划分为两个子集并分别运行它们时,相同的id范围通过得很好。这是问题,这是问题,但不是问题。
select SUBSTRING(pb.shortName, 0, CHARINDEX(' ', pb.shortName)) ,
       SUBSTRING(pb.shortName, 0, CHARINDEX('/', pb.shortName)),

      SUBSTRING(pb.shortName, CHARINDEX('/', pb.shortName) + 1,
                CHARINDEX(' ', pb.shortName) - CHARINDEX('/', pb.shortName) - 1)
                from someTable2 pb
                between pb.colname 1 and 200

            similarly run for [someTable] mt