2013-10-12 246 views
3

我的查詢導致以下錯誤: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

我懷疑問題出在這串(第26行中的code):

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)返回多行,所以你得到一個錯誤。

你治療inserted作爲一個行的表(例如,你從它像SELECT @ItemNo = I.ItemNo, @ItemDescription = I.ItemDescription FROM Inserted I越來越參數,但inserted表可以有多個行所以你的情況,我認爲你有3個選擇 - 檢查有隻有1行插入,重寫觸發爲基於集合的,或使用遊標。

這裏的sql fiddle有幾分相似的例子。

+0

禁用觸發器完成了這項工作。謝謝。 – Ben

0

如果您確實只想插入一行,那麼您只需在末尾添加Where,然後添加一些謂詞(邏輯語句),該查詢在查詢讀取的表中只有一行時爲true。

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]; 

...但使用選擇生成要插入的行執行插入時,您只需鍵入Select語句,而不是Values()條款,沒有括號。我認爲,因爲你有了括號,查詢處理器假定你希望這是一個單一的值。你想只插入一行數據?或一整套數據行?

+0

我喜歡整套,我知道以下工作:WHERE [nr] ='somenumber';但是,如果我刪除WHERE並執行沒有或帶括號的查詢,我會得到相同的錯誤。 – Ben

+0

@Ben,這與標準SQL不一致,插入應該可以很好地處理返回多行的Select。請顯示您正在使用的確切SQL,沒有Where子句,您遇到錯誤...除非你的錯誤是來自這個表上的某個觸發器,它試圖用這個數據對子查詢做另一個表? –

-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