SQL Server - 在“返回”附近的预期条件的上下文中指定的非布尔类型的表达式
Posted
技术标签:
【中文标题】SQL Server - 在“返回”附近的预期条件的上下文中指定的非布尔类型的表达式【英文标题】:SQL Server - An expression of non-boolean type specified in a context where a condition is expected, near 'RETURN' 【发布时间】:2014-05-29 08:06:19 【问题描述】:在 SQL Server 2012 中使用以下查询出现此错误。
在预期条件的上下文中指定的非布尔类型表达式,靠近“RETURN”。
CREATE FUNCTION [dbo].[GetPMResources](@UserResourceNo nvarchar(250))
RETURNS @Resources TABLE (
ResourceNo nvarchar(250) COLLATE Latin1_General_CS_AS not null,
Name nvarchar(250) COLLATE Latin1_General_CS_AS not null
)
AS
BEGIN
Declare @RoleID int, @UserDivision nvarchar(20)
SELECT TOP(1) @RoleID = r.ReportingRole, @UserDivision = r.DivisionCode
FROM Resource r
WHERE r.ResourceNo = @UserResourceNo
INSERT @Resources
SELECT r.ResourceNo,Name = r.ResourceNo + ' ' + r.Name
FROM Resource r WHERE r.ResourceNo IN
(
SELECT m.ResourceNo FROM JobMember m
JOIN Job j ON j.JobNo = m.JobNo
WHERE j.ProjectManagerNo = @UserResourceNo
OR
j.AlternateProjectManagerNo = @UserResourceNo
)
OR
(
SELECT m.ResourceNo FROM JobMember m
JOIN JobTask t ON t.JobTaskNo = m.JobTaskNo
WHERE t.TaskManagerNo = @UserResourceNo
OR
t.AlternateTaskManagerNo = @UserResourceNo
)
RETURN
END
【问题讨论】:
【参考方案1】:在预期条件的上下文中指定的非布尔类型的表达式
当我在指定我的连接子句时忘记添加 ON 条件时,我也得到了这个错误。
【讨论】:
我刚刚得到它是因为我有两次 WHERE 子句...呵呵。【参考方案2】:这是无效的语法。您正在将关系表达式与标量运算符 (OR
) 混合使用。具体来说,您不能合并expr IN (select ...) OR (select ...)
。你可能想要expr IN (select ...) OR expr IN (select ...)
。使用联合也可以:expr IN (select... UNION select...)
【讨论】:
感谢您的纠正,现在我意识到我在哪里犯了错误。感谢您的回复。【参考方案3】:你的问题可能在这里:
OR
(
SELECT m.ResourceNo FROM JobMember m
JOIN JobTask t ON t.JobTaskNo = m.JobTaskNo
WHERE t.TaskManagerNo = @UserResourceNo
OR
t.AlternateTaskManagerNo = @UserResourceNo
)
试着换成
OR r.ResourceNo IN
(
SELECT m.ResourceNo FROM JobMember m
JOIN JobTask t ON t.JobTaskNo = m.JobTaskNo
WHERE t.TaskManagerNo = @UserResourceNo
OR
t.AlternateTaskManagerNo = @UserResourceNo
)
【讨论】:
【参考方案4】:你也可以这样重写
FROM Resource r WHERE r.ResourceNo IN
(
SELECT m.ResourceNo FROM JobMember m
JOIN Job j ON j.JobNo = m.JobNo
WHERE j.ProjectManagerNo = @UserResourceNo
OR
j.AlternateProjectManagerNo = @UserResourceNo
Union All
SELECT m.ResourceNo FROM JobMember m
JOIN JobTask t ON t.JobTaskNo = m.JobTaskNo
WHERE t.TaskManagerNo = @UserResourceNo
OR
t.AlternateTaskManagerNo = @UserResourceNo
)
您的 RETURN 语句中还需要一个返回表
【讨论】:
感谢您的回复和建议。以上是关于SQL Server - 在“返回”附近的预期条件的上下文中指定的非布尔类型的表达式的主要内容,如果未能解决你的问题,请参考以下文章