2013-10-12 184 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