2012-06-27 5 views
0

Я получаю ввод ключевых слов в текстовом поле, таком как test, check, .. и т. Д. Я вставляю это ключевое слово в виде отдельных строк в свою базу данных, проверяя, существует ли оно, если существует обновление или еще вставить .Так KeywordId и элемент, который представляет в этом идентификатор должен быть вставлен в мост table.On вставки существующего ключевого слова он выдает ошибки:Ошибка SQL: Подзапрос вернул более 1 значения

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

Cannot insert the value NULL into column 'KeywordId', table 'dbo.Keywordsitems'; column does not allow nulls. INSERT fails.

Я использую ниже хранимую процедуру

ALTER PROCEDURE [dbo].[InsertKeywords] 
(
    @keywordName nvarchar(256), 
    @itemid uniqueidentifier 
) 
AS 
begin 
    declare 
    @itemid uniqueidentifier, 
    @keywordid uniqueidentifier, 
    @id uniqueidentifier; 
    declare @keyworddata table (keywordid uniqueidentifier); 

    set @id = (select KeywordId from keywords where [email protected]) 
    set @itemid =(select itemId from Items where ItemID = @itemid); 

    if not exists(select keyname from keywords where KeyName = @keywordName) 
    begin 
    insert into Keywords(KeywordId,KeyName) 
    output inserted.KeywordId into @keyworddata(keywordid) 
    values (newid(),@keywordName); 

    select @keywordid = keywordid from @keyworddata; 

    insert into Keywordsitems(KeywordId,ItemId) 
    values (@keywordid,@itemid); 
    end 
    else 
    begin 
    update keywords set [email protected] where KeywordName= @keywordName; 
    insert into KeywordsResources(KeywordId,itemId) values (@id,@itemid);  
    end 
end 
+0

Если у вас есть несколько строк с тем же '' KeyName' или ItemID', какой из них вы хотите? Похоже, что у вас где-то отсутствует ограничение. –

+0

Мне нужно проверить одно и то же ключевое слово, если существует обновление, если не вставить его. Мне нужна проверка в моей таблице ключевых слов, у которой есть только ключевое слово, ключевое слово name column.Onse обновление или вставка делается в таблице ключевых слов позже мне нужно вставить на мост таблица, где я должен вставить как keywordid, так и itemid. – newuser1555

+0

Ваш код сильно зависит от вашего кода. Ваш '@ itemid' переключается с' @ itemid' на '@ databaseid'? Зачем? Если для определенного элемента существует более одного 'resourcedatabaseId', что вы хотите сделать? В настоящее время (с исправлением, приведенным ниже) он собирается выбрать произвольный идентификатор базы данных, а не цикл через все из них. '@ itemid' не волшебным образом становится массивом ... –

ответ

0

Вы можете использовать TOP 1, чтобы решить эту проблему.

Е.Г.,

... 
set @id = (select top 1 KeywordId from keywords where [email protected]) 
set @itemid =(select top 1 resourcedatabaseId from Items where ItemID = @itemid); 
... 
+3

, только если у вас нет причин заботиться о том, какой из двух вы получите. – HLGEM

+0

@HLGEM Да, хорошая точка! – RedFilter

+0

@HLGEM: Не могли бы вы объяснить это. Я не понимаю вашу точку зрения. Возможно, я ошибаюсь в своем подходе. Просто ищет лучший код для этого. – newuser1555

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