在查询中,我使用了多个SUBSTRING
,CHARINDEX
,LEN
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
答案 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