【发布时间】:2017-11-17 02:28:17
【问题描述】:
谁能解释一下为什么下面的查询会返回一个结果集:
SELECT sub.*, xr.*
FROM (
select rc.CommentID,
[CreateDate] = LEFT(rc.Comments, 10),
[CreatedBy] = SUBSTRING(rc.Comments, 12, CHARINDEX(':', rc.Comments) - 12),
src.Comments
from dbo.RequestComments rc
where rc.CommentID NOT IN( 4290, 4289, 4221)
) sub
LEFT JOIN dbo.SWDBCWUserXRef xr
ON sub.CreatedBy = xr.EnteredByName
...但是,如果我将其修改为使用 INNER JOIN 而不是 LEFT JOIN:
SELECT sub.*, xr.*
FROM (
select rc.CommentID,
[CreateDate] = LEFT(rc.Comments, 10),
[CreatedBy] = SUBSTRING(rc.Comments, 12, CHARINDEX(':', rc.Comments) - 12),
src.Comments
from dbo.RequestComments rc
where rc.CommentID NOT IN( 4290, 4289, 4221)
) sub
JOIN dbo.SWDBCWUserXRef xr
ON sub.CreatedBy = xr.EnteredByName
我收到以下错误:
Msg 537, Level 16, State 3, Line 3
Invalid length parameter passed to the LEFT or SUBSTRING function.
谢谢。
【问题讨论】:
-
可能是因为您在 SUBSTRING...CHARINDEX(... 产生负值的 INNER JOIN 中获得了更多记录。
-
如果这是整个查询,我很难相信您会这样做。当你不使用
common-table-expression时,为什么要标记?你能发布一个重现问题的脚本吗?最可能的解释:问题出现在您没有向我们展示的代码的某些部分。 -
最有可能编译器在不考虑 NOT IN 的情况下首先处理连接,导致一些 CreatedBy 为 NULL / -1 等。也许考虑一个 CTE(可能做同样的事情),或者一个 temptable/子查询的表变量。
-
@mjw 如何从 LEFT JOIN 更改为 INNER JOIN 导致更多记录?以及外部查询中的JOIN类型如何影响单表子查询中的LEFT()或SUBSTRING()?
-
用任何东西替换你的 SUBSTRING 表达式......比如说,'TEST',看看你是否仍然得到同样的错误。猜测您在 rc.Comments 列中有一些您不期望的数据。