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 - 在“返回”附近的预期条件的上下文中指定的非布尔类型的表达式的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server TOP(1) 具有不同的

以位为条件的 SQL

奇怪的“返回的数据与列的预期数据长度不匹配”错误,而预期长度要大得多 - SQL SERVER 2012

sql-server:“,”附近的语法不正确

SQL Server 附近的语法不正确

使用联接的 SQL Server 全文搜索无法按预期工作