2013-10-12 2 views
3

Мой запрос вызывает следующее сообщение об ошибке:SQL подзапрос возвращает более чем на 1 значение

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 варианта. - проверка что есть только одна строка в вставлена, переписать триггер, как установлено на основе, или использовать курсор.

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

... но при выполнении Insert с помощью выбора для создания строки для вставки, просто введите 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

Смежные вопросы