2017-12-22 18 views
0

SQL을 사용하여 SCCM에서 Windows 업데이트 준수 데이터를 반환하려고 할 때 내장 SSRS 보고서에서 쿼리를 추출했습니다.하위 쿼리가 두 개 이상의 값을 반환했습니다. 서브 쿼리

@colname (컴퓨터 그룹)마다 별도의 쿼리를 실행하는 대신 @colname을 테이블로 선언하고 여러 값을 삽입하여 하나의 쿼리로 결합하려고합니다.

오류가 SQL에 반환됩니다

메시지 512, 수준 16, 상태 1, 줄 6
하위 쿼리는 1 개 이상의 값을 반환했습니다. 하위 쿼리가 =,! =, <, < =,>,> = 또는 하위 쿼리가 식으로 사용될 때 하위 쿼리가 수행되는 경우에는 허용되지 않습니다.

내 코드 : 어떤 도움을 주시면 감사

DECLARE @title VARCHAR(500); 
DECLARE @colname TABLE (name VARCHAR(100)); 

SET @title = 'ADR | Workstation Software Updates 2017-12-14 09:01:38'; 

INSERT INTO @colname 
VALUES ('All Alpha Workstations'), ('All Beta Workstations'), ('All Delta Workstations'); 

SELECT DISTINCT 
    COUNT(*) [Total Clients], li.title, coll.name, 
    SUM(CASE WHEN ucs.status = 3 OR ucs.status = 1 THEN 1 ELSE 0 END) AS 'Installed/Not Applicable', 
    SUM(CASE WHEN ucs.status = 2 THEN 1 ELSE 0 END) AS 'Required', 
    SUM(CASE WHEN ucs.status = 0 THEN 1 ELSE 0 END) as 'Unknown', 
    ROUND((CAST(SUM(CASE WHEN ucs.status = 3 OR ucs.status = 1 THEN 1 ELSE 0 END) AS float)/COUNT(*)) * 100, 2) AS 'Success %', 
    ROUND((CAST(COUNT(CASE WHEN ucs.status NOT IN ('3', '1') THEN '*' END) AS FLOAT)/COUNT(*)) * 100, 2) AS 'Not Success%' 
FROM 
    v_Update_ComplianceStatusAll UCS 
INNER JOIN 
    v_r_system sys ON ucs.resourceid = sys.resourceid 
INNER JOIN 
    v_FullCollectionMembership fcm ON ucs.resourceid = fcm.resourceid 
INNER JOIN 
    v_collection coll ON coll.collectionid = fcm.collectionid 
INNER JOIN 
    v_AuthListInfo LI ON ucs.ci_id = li.ci_id 
WHERE 
    li.title = @title 
    AND coll.name = (SELECT name FROM @colname) --and ucs.status=2 
GROUP BY 
    li.title, coll.name 
ORDER BY 
    1 

. 감사합니다

+1

오류 MSG가 분명하다, 당신'(@collname에서 이름을 선택)'1 개 이상의 값을 반환합니다. – Sami

+0

분명히 1 개 이상의 값을 반환합니다. 예. 그러나 여러 가치를 다루는 방법에 대한 도움이 필요했습니다. –

답변

2

하위 쿼리 select name from @collname이 두 개 이상의 값을 반환하기 때문에 =을 사용할 수 없습니다. 대신 =

사용 IN 조건 :

where [email protected] and coll.name in (select name from @collname) 
+1

완벽한입니다. 고맙습니다. –

+0

@TomPearson - 환영합니다. 도움이된다면 대답을 수락하십시오 : D –

0

왜 이것에 대한 테이블 변수를 사용? 필요가 없습니다 (테이블 변수는 1007을 사용하는 2017을 사용하지 않는 한 항상 1 행을 반환 할 것으로 예상됩니다). 의 경우은 쿼리 성능에 중요한 영향을 미칩니다.

그냥 수행

and coll.name IN ('All Alpha Workstations','All Beta Workstations','All Delta Workstations')