2015-03-05 3 views
-1

См. Мой предыдущий вопрос, что я все еще застрял. Insert statement with sub queriesПодзапрос возвратил более 1 значения в SQL SErver 2008

У меня есть 4 колонки мне нужно обратиться, и я не могу удалить таблицу, чтобы изменить 4-й столбец из междунар не нуль в

я был направлен от этого первоначального заявления:

INSERT into ADVNET.dbo.KenCatItemTest 
(categoryitemid,itemid,categoryid) 
SELECT NEWID(),itemid,'0FCA508F-7EB5-4C2E-8803-DE688C4126E5' 
FROM janel.dbo.item 
WHERE janel.dbo.item.itemnumber like 'c-%' and listprice > 0 

и он вызывает ошибку:

Невозможно вставить значение NULL в столбец «LineSequence», таблицу «ADVNET.dbo.KenCatItemTest»; столбец не допускает нулей. INSERT терпит неудачу. Заявление было прекращено.

Так что теперь я смотрю на это заявление вместо:

DECLARE @CategoryItemId uniqueidentifier; 
SET @CategoryItemId = NEWID(); 
DECLARE @ItemID uniqueidentifier; 
SET @ItemId = (select itemid from janel.dbo.item 
WHERE janel.dbo.item.itemnumber like 'c-%' and listprice > 0); 
DECLARE @CategoryID uniqueidentifier; 
SET @CategoryID = '0FCA508F-7EB5-4C2E-8803-DE688C4126E5'; 
DECLARE @LineSequence int; 
SELECT @LineSequence = ISNULL(MAX(LineSequence),0) + 1 
FROM KenCatItemTest WHERE CategoryId = @CategoryId; 
INSERT INTO ADVNET.dbo.KenCatItemTest 
(CategoryItemId, ItemId, CategoryId, LineSequence) 
VALUES (@CategoryItemId, @ItemId, @CategoryId, @LineSequence) 

это новое заявление бросает ошибку:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. Msg 515, Level 16, State 2, Line 5 Cannot insert the value NULL into column 'ItemId', table 'ADVNET.dbo.KenCatItemTest'; column does not allow nulls. INSERT fails. The statement has been terminated.

ответ

1

Это утверждение вызывает проблему:

SET @ItemId = (select itemid from janel.dbo.item 
WHERE janel.dbo.item.itemnumber like 'c-%' and listprice > 0); 

Если существует более одной строки, которая удовлетворяет условию, тогда ошибка будет возникать, потому что SET ожидает, что будет скалярное значение, возвращенное с правой стороны, а не набор строк.

Чтобы исправить это, вы можете либо сузить критерии, в которых возвращается только одна строка, либо сделать что-то вроде вытягивания первого значения.

Например:

SET @ItemId = (select TOP 1 itemid from janel.dbo.item 
WHERE janel.dbo.item.itemnumber like 'c-%' and listprice > 0); 
+0

спасибо @ Джейсон-Фолкнер. но как я могу выполнить задачу переноса всех записей и создания всех строк? Возможно, я не должен использовать скалярные переменные? – KenSummersNJ

+0

@KEN - Простой способ - использовать «CURSOR». https://msdn.microsoft.com/en-us/library/ms180169.aspx –

+0

Нет необходимости в том, чтобы курсор делал вставки. Я не вижу ничего в коде из OP, который предполагает, что требуется какой-либо цикл. –

0

Вы можете не только использовать row_number(), чтобы сгенерировать значение для LineSequence?

INSERT INTO ADVNET.dbo.KenCatItemTest(
      categoryitemid 
      ,itemid 
      ,categoryid 
      ,LineSequence) 
    SELECT 
      NEWID() 
      ,itemid 
      ,'0FCA508F-7EB5-4C2E-8803-DE688C4126E5' 
      ,ROW_NUMBER() OVER(ORDER BY ItemId) 
     FROM 
      janel.dbo.item i 
    WHERE 
      i.itemnumber LIKE 'c-%' 
     AND listprice > 0 
Смежные вопросы