Если еще в 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:
Подзапрос возвратил больше значений. Это недопустимо, когда подзапрос следует за =,! =, <, <=,>,> = Или при использовании в качестве выражения.
У кого-то есть решение?
Ответы
Ответ 1
Спасибо всем за ваши ответы, но я понял, как это сделать, и окончательная процедура выглядит так:
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 или 0 или число, полученное из count()
Ответ 2
Если нет соответствующих строк/строк, то @ParLngId
будет NULL
не нулевым, поэтому вам нужно IF @ParLngId IS NULL
.
Вы также должны использовать SCOPE_IDENTITY()
а не @@IDENTITY
.
Ответ 3
Попробуй это -
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
Ответ 4
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;
Ответ 5
Вам не нужно иметь прокладку RETURN.
Попросите пыльника взглянуть на использование хранимой процедуры с выходными параметрами
Также взгляните на раздел OUT в CREATE PROCEDURE
Ответ 6
Попробуйте это с помощью запросов на соединение
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
Ответ 7
Вместо того, чтобы писать:
Select top 1 ParLngId from T_Param where ParStrNom = 'Extranet Client'
Написать:
Select top 1 ParLngId from T_Param where ParStrNom IN 'Extranet Client'
т.е. заменить знак '='
на 'IN'