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

时间:2013-12-18 06:56:45

标签: sql sql-server

在查询中,我使用了多个SUBSTRINGCHARINDEXLEN T-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

2 个答案:

答案 0 :(得分:0)

我不担心范围。你真正的问题是你的一个子串调用试图占用比字段更多的字符。

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

例如,如果pb.shortName只有一个字符,则下面的代码会引起问题:

SUBSTRING(pb.shortName, CHARINDEX('/', pb.shortName) + 1,
                CHARINDEX(' ', pb.shortName) - CHARINDEX('/', pb.shortName) - 1)

这将是一个问题,因为您依赖于字符串中的/以及该字符串中的特定顺序。

在不知道应用/数据库的格式规则的情况下,很难为您提供进一步的帮助。

答案 1 :(得分:0)

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

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