2013-10-12 3 views
3

내 쿼리는 다음과 같은 오류가 발생합니다 1 개 이상의 값을 반환SQL 하위 쿼리

Msg 512, Level 16, State 1, Procedure Item_insupd, Line 17
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

검색어 :

INSERT INTO [Total_Database].[dbo].[Item] 
    (
     ItemID, 
     ItemNo, 
     ItemDescription, 
     Notes, 
     StandardCost, 
     SalesGLAccountID, 
     ItemTypeID, 
     Backorderable 
    ) 
(
    SELECT [nr], 
      [nr], 
      [Latijn]+' '+[Subgroep]+' '+CAST([nr] as VARCHAR(255)), 
      [NL]+' '+[Vorm]+' '+[Kenmerk]+' '+[Hoogte],[Inkoopprijs], 
      (4), 
      (case when [Productgroep]='PB' then 1 else 5 end), 
      (1) 
    FROM [ACCESDATA].[dbo].[Planten] 
); 

내가 불행하게도 내가 할 내 하위 쿼리는 WHERE 포함되어 있지 않기 때문에 이런 일이 의심 올바른 WHERE 절을 구성하는 방법을 알지 못합니다.

+3

'INSERT..SELECT'이 주위에 괄호가없는' SELECT '입니다. 괄호는 서브 쿼리로 만들어지며, 그곳은 바깥에 있습니다. – RBarryYoung

+3

@RBarryYoung 대답이라면 좋은 대답이 될 수 있습니다. – GolezTrol

+0

@ GolezTrol 네가 맞아, 대답으로 추가했다. – RBarryYoung

답변

4

나는 문제가 (당신의 code에 라인 (26))이 문자열에 의심 : 오류가 있어요 그래서

IF NOT (EXISTS (SELECT G.GLAccountID FROM GLAccnt G INNER JOIN Inserted I ON G.GLAccountID = I.SalesGLAccountID)) 
OR ((SELECT I.COGSGLAccountID FROM Inserted I) IS NOT NULL) AND NOT (EXISTS (SELECT G.GLAccountID FROM GLAccnt G INNER JOIN Inserted I ON G.GLAccountID = I.COGSGLAccountID)) 

그것은 (SELECT I.COGSGLAccountID FROM Inserted I) 복귀 하나 이상의 행 같습니다.

당신은 예를 들어, 당신이 SELECT @ItemNo = I.ItemNo, @ItemDescription = I.ItemDescription FROM Inserted I처럼에서 매개 변수를 받고있어 (한 행 테이블로 inserted을 치료하고 있지만 inserted 표는 둘 이상의 행을 가질 수 있습니다 난 당신이 3 가지 옵션이 있다고 생각 귀하의 경우 그래서 -. 점검을 삽입 만 1 행이 있다는 설정 기반으로 트리거를 다시 작성하거나, 커서를 사용합니다.

다음

sql fiddle을 다소 비슷한 예에.

+0

트리거를 사용하지 않으면 작업이 수행되었습니다. 고맙습니다. – Ben

0

실제로 한 행만 삽입하려는 경우 끝에 Where을 추가 한 다음 쿼리에서 읽는 테이블의 한 행에만 해당되는 일부 조건 자 (논리 문)를 추가하십시오.

INSERT INTO [Total_Database].[dbo].[Item](ItemID, 
    ItemNo,ItemDescription,Notes,StandardCost,SalesGLAccountID, 
    ItemTypeID,Backorderable) 
SELECT [nr],[nr],[Latijn]+' '+[Subgroep]+' '+CAST([nr] as VARCHAR(255)), 
      [NL]+' '+[Vorm]+' '+[Kenmerk]+' '+[Hoogte],[Inkoopprijs],(4), 
      (case when [Productgroep]='PB' then 1 else 5 end),(1) 
FROM [ACCESDATA].[dbo].[Planten] 
Where [SomeColumnName] = [some Value]; 

...하지만 행을 삽입 할 생성하는 선택을 사용하여 삽입을 수행 할 때, 당신은 괄호를 둘러싼하지 않고 대신 Values() 조항의 선택 문을 입력합니다. 나는 당신이 둘러싼 괄호를 가지고 있기 때문에, 쿼리 프로세서는 그것을 당신이 단일 값으로 원한다고 생각했다. 한 행의 데이터 만 삽입 하시겠습니까? 또는 전체 데이터 행 집합?

+0

나는 전체 세트를 좋아한다. 나는 다음 작품이 있다는 것을 안다. WHERE [nr] = 'somenumber'; 하지만 내가 어디서 제거하고 괄호없이 또는 같은 오류가 발생합니다 쿼리를 실행할 경우. – Ben

+0

@Ben, 표준 SQL과 일치하지 않으므로 Insert는 여러 행을 반환하는 Select로 올바르게 작동해야합니다. Where 절을 사용하지 않고 사용중인 정확한 SQL을 표시하십시오. 오류가 발생했습니다 ...이 데이터로 하위 쿼리를 사용하여 다른 테이블로 무언가를 시도하는이 테이블의 일부 트리거에서 오류가 발생하지 않는 한? –

-1
INSERT INTO [Total_Database].[dbo].[Item] 
    (
     ItemID, 
     ItemNo, 
     ItemDescription, 
     Notes, 
     StandardCost, 
     SalesGLAccountID, 
     ItemTypeID, 
     Backorderable 
    ) IN 
(
    SELECT [nr], 
      [nr], 
      [Latijn]+' '+[Subgroep]+' '+CAST([nr] as VARCHAR(255)), 
      [NL]+' '+[Vorm]+' '+[Kenmerk]+' '+[Hoogte],[Inkoopprijs], 
      (4), 
      (case when [Productgroep]='PB' then 1 else 5 end), 
      (1) 
    FROM [ACCESDATA].[dbo].[Planten] 
); 
+0

선택 전에 IN을 추가하면 다중 값을 선택할 수 있습니다. – chevhfghfghfgh