2013-08-30 7 views
25

Я создал хранимую процедуру следующим образом:Если еще в сервере SQL хранимой процедуры

Create Procedure sp_ADD_USER_EXTRANET_CLIENT_INDEX_PHY 
(
@ParLngId int output 
) 
as 
Begin 
    SET @ParLngId = (Select top 1 ParLngId from T_Param where ParStrNom = 'Extranet Client') 
    if(@ParLngId = 0) 
     begin 
      Insert Into T_Param values ('PHY', 'Extranet Client', Null, Null, 'T', 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, NULL, NULL, NULL) 
      SET @ParLngId = @@IDENTITY 
     End 
    Return @ParLngId 
End 

Так я установил переменную @ParLngId, я проверяю если есть такие данные в таблице, если да, то я вернусь значение, если нет, я вставляю один и возвращаю переменную, которая содержит идентификатор вставленной строки ... Но теперь это показывает мне SqlException:

Подзапрос возвратил больше значений. Это недопустимо, когда подзапрос следует за =,! =, <, < =,>,> = Или при использовании в качестве выражения.

У кого-нибудь есть решение?

+0

«ошибку, говоря, что разные значения были возвращены» - могли бы вы изменить в точном тексте сообщения об ошибке для нас, пожалуйста? – AakashM

+0

Можете ли вы скопировать/вставить точное сообщение об ошибке? – UnhandledExcepSean

+0

Я только что редактировал сообщение –

ответ

35

Спасибо всем за ваши ответы, но я понял, как это сделать, и окончательная процедура выглядит следующим образом:

Create Procedure sp_ADD_RESPONSABLE_EXTRANET_CLIENT 
(
@ParLngId int output 
) 
as 
Begin 
if not exists (Select ParLngId from T_Param where ParStrIndex = 'RES' and ParStrP2 = 'Web') 
    Begin 
      INSERT INTO T_Param values('RES','¤ExtranetClient', 'ECli', 'Web', 1, 1, Null, Null, 'non', 'ExtranetClient', 'ExtranetClient', 25032, Null, '[email protected]', 'Extranet-Client', Null, 27, Null, Null, Null, Null, Null, Null, Null, Null, 1, Null, Null, 0) 
      SET @ParLngId = @@IDENTITY 
    End 
Else 
    Begin 
      SET @ParLngId = (Select top 1 ParLngId from T_Param where ParStrNom = 'Extranet Client') 
      Return @ParLngId 
    End 
End 

Так то, что я нашел , и который сделал это работает:

, если не существует

Это позволяет использовать логическое вместо Null или или число в результате из графа()

10

Если нет соответствующей строки/с, то @ParLngId будет NULL не равна нулю, так что вам нужно IF @ParLngId IS NULL.

Вы также должны использовать SCOPE_IDENTITY(), а не @@IDENTITY.

+0

@@ Идентичность работает. Это работает до того, когда мне не нужно было использовать Else If, ​​я не думаю, что проблема возникает из-за этого –

0

Попробуйте один -

CREATE PROCEDURE sp_ADD_USER_EXTRANET_CLIENT_INDEX_PHY 
AS 
BEGIN 

    DECLARE @ParLngId INT 
    SELECT TOP 1 @ParLngId = ParLngId 
    FROM dbo.T_Param 
    WHERE ParStrNom = 'Extranet Client' 

    IF (@ParLngId = 0) 
    BEGIN 
     INSERT INTO dbo.T_Param 
     VALUES ('PHY', 'Extranet Client', NULL, NULL, 'T', 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, NULL, NULL, NULL) 

     RETURN SCOPE_IDENTITY() 
    END 
    ELSE BEGIN 

     RETURN @ParLngId 

    END 

END 
+1

Он не работает ни ... –

0

Попробуйте это присоединиться запросы к

CREATE PROCEDURE [dbo].[deleteItem] 
@ItemId int = 0 
AS 
Begin 
DECLARE @cnt int; 

SET NOCOUNT ON 
SELECT @cnt =COUNT(ttm.Id) 
    from ItemTransaction itr INNER JOIN ItemUnitMeasurement ium 
     ON itr.Id = ium.ItemTransactionId INNER JOIN ItemMaster im 
     ON itr.ItemId = im.Id INNER JOIN TransactionTypeMaster ttm 
     ON itr.TransactionTypeMasterId = ttm.Id 
     where im.Id = @ItemId 

if(@cnt = 1) 
    Begin 
    DECLARE @transactionType varchar(255); 
    DECLARE @mesurementAmount float; 
    DECLARE @itemTransactionId int; 
    DECLARE @itemUnitMeasurementId int; 

     SELECT @transactionType = ttm.TransactionType, @mesurementAmount = ium.Amount, @itemTransactionId = itr.Id, @itemUnitMeasurementId = ium.Id 
     from ItemTransaction itr INNER JOIN ItemUnitMeasurement ium 
      ON itr.Id = ium.ItemTransactionId INNER JOIN TransactionTypeMaster ttm 
      ON itr.TransactionTypeMasterId = ttm.Id 
      where itr.ItemId = @ItemId 
     if(@transactionType = 'Close' and @mesurementAmount = 0) 
      Begin 
       delete from ItemUnitMeasurement where Id = @itemUnitMeasurementId; 

      End 
     else 
      Begin 
       delete from ItemTransaction where Id = @itemTransactionId; 
      End 
    End 
else 
Begin 
    delete from ItemMaster where Id = @ItemId; 
End 
END 
1
if not exists (select dist_id from tbl_stock where dist_id= @cust_id and [email protected]_id) 
    insert into tbl_stock(dist_id,item_id,qty)values(@cust_id, @item_id, @qty); 
else 
    update tbl_stock set qty=(qty + @qty) where dist_id= @cust_id and item_id= @item_id; 
-1

Вместо написания:

Select top 1 ParLngId from T_Param where ParStrNom = 'Extranet Client' 

Запись:

Select top 1 ParLngId from T_Param where ParStrNom IN 'Extranet Client' 

т.е. заменить '=' знак на 'IN'

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