SCOPE_IDENTITY() return NULL?
I am using SQL Server 2008 express, below is the SP, who return
(0 row(s) affected)
Msg 515, Level 16, State 2, Procedure sp_AddCarrierFees,
Line 21 Cannot insert the value NULL into column 'attribute_value_id', table 'MyDevSystem.dbo.shipping_fees';
column does not allow nulls. INSERT fails. The statement has been terminated.
(1 row(s) affected)
And this is the SP :
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_AddCarrierFees]
@carrier_id INT,
@zone_id INT,
@attribute_value_id INT,
@attribute_title varchar(20),
@fees decimal(6,2)
AS
BEGIN
if @attribute_value_id = 0 begin
insert into shipping_attribute_value (attribute_id,attribute_value,sort_order)
select attribute_id, @fees,0 from shipping_attribute where carrier_id=@carrier_id and attribute_title=@attribute_title;
declare @NewID int;
set @NewID = SCOPE_IDENTITY();
print @NewID;
insert into shipping_fees (zone_id, attribute_value_id) values (@zone_id, @NewID);
end
else
begin
update shipping_attribute_value set attribute_value=@fees where attribute_value_id=@attribute_value_id;
end
END
Any people know why? I h开发者_Go百科ave read many post in StackOverFlow, but still not find solution.Somebody say use @@IDENTITY or IDENT_CURRENT instead, but it possible got the identity who made by other users.
FIXED:I found the reason, because the first insert statement is fail, so why return (0 row(s) affected) , after i fix that insert statement,it works now. thanks you for everyone.
First verify that the shipping_attribute_value
actually has an identity
column. Without an identity column, scope_identity()
doesn't work.
EDIT: I missed that the insert
is actually using the select
, but marc_s noticed it :) *grabs coffee*
How about doing a separate select just to see the output:
select attribute_id, @fees,0 from shipping_attribute
where carrier_id=@carrier_id and attribute_title=@attribute_title;
insert into shipping_attribute_value (attribute_id,attribute_value,sort_order)
select attribute_id, @fees,0 from shipping_attribute
where carrier_id=@carrier_id and attribute_title=@attribute_title;
If no rows are inserted, scope_identity()
should be null :)
精彩评论