SQL Server - 在预期条件的上下文中指定的非布尔类型的表达式,靠近"RETURN"

Soh*_*N3N 12 sql sql-server sql-server-2012

在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
Run Code Online (Sandbox Code Playgroud)

Rem*_*anu 9

那是无效的语法.您正在使用标量运算符(OR)混合关系表达式.具体你不能合并expr IN (select ...) OR (select ...).你可能想要expr IN (select ...) OR expr IN (select ...).使用union也可以:expr IN (select... UNION select...)


小智 9

在期望条件的上下文中指定的非布尔类型的表达式

当我在指定join子句时忘记添加ON条件时,我也遇到了这个错误.


小智 6

你的问题可能出在这里:

OR
                        (
                            SELECT m.ResourceNo FROM JobMember m
                            JOIN JobTask t ON t.JobTaskNo = m.JobTaskNo
                            WHERE t.TaskManagerNo = @UserResourceNo
                            OR
                            t.AlternateTaskManagerNo = @UserResourceNo
                        )
Run Code Online (Sandbox Code Playgroud)

尝试更改为

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
                        )
Run Code Online (Sandbox Code Playgroud)