在where子句中使用'in'返回子查询返回的值超过1

时间:2019-07-14 12:28:50

标签: sql sql-server

当我使用参数正常运行查询时,查询工作正常。但是一旦我将其设为动态,就会导致错误。

我对SQL Server很陌生。 当我打印查询并运行它时,它工作正常。但是,当动态运行时,会导致“子查询返回的值超过1个”错误。

declare @query nvarchar(max) =  'Select * 
                    into #tempFilteredData              
                    from 
                    (
                    SELECT td.UserId AS [EmployeeID],w.NAME AS [EmployeeName],at.ActivityCode AS [ActivityType],td.TargetAssigned,td.Mkt_TerritoryId,
                    wd.WeekName + ''('' + CONCAT((RTRIM(CONVERT(CHAR(3),DATENAME(day, wd.WeekStartDate),0))), ''-'', CONVERT(CHAR(3),DATENAME(month, wd.WeekStartDate),0),''To'',
                    (RTRIM(CONVERT(CHAR(3),DATENAME(day, wd.WeekEndDate),0))), ''-'', CONVERT(CHAR(3),DATENAME(month, wd.WeekEndDate),0)) + '')'' AS weekName
                    FROM tblTargetDetails td
                    INNER JOIN FMC_CMaster..Worker w ON td.UserId = w.[Personnel Number]
                    INNER JOIN FMC_CMaster..[vwAuthenticateUser] vw ON vw.UserId = td.UserId and vw.Blocked=''No'' and vw.Closed=''No'' AND vw.AssetCode = ''MPH''
                    INNER JOIN tblActivityType at ON at.ActivityTypeId = td.ActivityTypeId
                    INNER JOIN WeekDetails wd ON wd.WeekId = td.WeekId
                    LEFT JOIN FMC_CMaster..Marketing_Hierarchy_AMM_Level mrktHAL ON w.[Personnel Number] = mrktHAL.TMH_Code 
                    WHERE td.CreatedBy =  ''' + @LoggedInUserId + '''  
                    AND mrktHAL.TMH_Code = ''' + @TMHCode + '''  

                    ) as p 
                    pivot(
                    MAX([TargetAssigned]) for [WeekName] in ('+RTRIM(LTRIM(@columnName))+')
                    ) as pvt

                    select * from #tempFilteredData where Mkt_TerritoryId IN ( '+(SELECT [MktTerritoryName] FROM @MktTerritoryNames)+' )'
        PRINT (@query)
        exec (@query)

我想在临时表#tempFilteredData中搜索从@MktTerritoryNames返回的所有结果

1 个答案:

答案 0 :(得分:0)

第一个查询表达式中没有子查询。

导致第二个。表达式中是做什么的?

select * from #tempFilteredData where Mkt_TerritoryId IN ( '+(SELECT [MktTerritoryName] FROM @MktTerritoryNames)+' )'

我什至不知道这应该在做什么。也许您想在创建临时表后 运行它。而且,它不必是动态的,只需:

select *
from #tempFilteredData
where Mkt_TerritoryId IN (SELECT [MktTerritoryName] FROM @MktTerritoryNames);