我创建了一个存储过程如下:
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
,我检查表中是否有这样的数据,如果是,我返回值,如果不是,我插入一个并返回包含插入的Id的变量line ...但现在它显示了一个SqlException:
子查询返回了更多值。当子查询跟随=时,这是不允许的! =,<,< =,>,> =或者当用作表达式时。
有人有解决方案吗?
答案 0 :(得分:43)
谢谢大家的答案,但我想出了怎么做,最后的程序看起来像这样:
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, 'informatique.interne@company.fr', '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()
的数字答案 1 :(得分:11)
如果没有匹配的行/ s,则@ParLngId
将NULL
不为零,因此您需要IF @ParLngId IS NULL
。
您还应该使用SCOPE_IDENTITY()
而不是@@IDENTITY
。
答案 2 :(得分:2)
试试这个 -
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
答案 3 :(得分:1)
if not exists (select dist_id from tbl_stock where dist_id= @cust_id and item_id=@item_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;
答案 4 :(得分:0)
答案 5 :(得分: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
答案 6 :(得分:0)
您可以尝试下面的过程Sql:
Create Procedure sp_ADD_USER_EXTRANET_CLIENT_INDEX_PHY
(
@ParLngId int output
)
as
Begin
-- Min will return only 1 value, if 'Extranet Client' is found
-- IsNull will take care of 'Extranet Client' not found, returning 0 instead of Null
-- But T_Param must be a Master Table with ParStrNom having a Unique Index, if so Min is not reqd at all
-- But 'PHY', 'Extranet Client' suggests that Unique Key has 2 columns, not just ParStrNom
SET @ParLngId = IsNull((Select Min (ParLngId) from T_Param where ParStrNom = 'Extranet Client'), 0);
-- Nothing changed below
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
答案 7 :(得分:-2)
而不是写作:
www.library.com/shelves?include=books&filter[books.unread]=true
写:
Select top 1 ParLngId from T_Param where ParStrNom = 'Extranet Client'
即。将Select top 1 ParLngId from T_Param where ParStrNom IN 'Extranet Client'
替换为'='