SQL Server查询,传递给LEFT或SUBSTRING函数的长度参数无效
在查询中,我使用了几个子字符串、CHARINDEX、lent-SQL函数 我得到一个错误: 传递给LEFT或SUBSTRING函数的长度参数无效` 好的,我正试图找出哪些记录导致无法过滤它 在WHERE语句中,我尝试: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
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