我使用的是SQL Server 2008 Express,下面是SP,谁返回
(0行(s)受影响)
Msg 515,等级 16,状态2,程序 sp_AddCarrierFees,
第21行不能 将值NULL插入列 'attribute_value_id',表格 'MyDevSystem.dbo.shipping_fees';
柱 不允许空值。 INSERT失败。 声明已经终止。
(1行受影响)
这是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
有人知道为什么吗?我已经在StackOverFlow中阅读了很多帖子,但仍然没有找到解决方案。有人说使用@@ IDENTITY或IDENT_CURRENT代替,但有可能得到其他用户制作的身份。
FIXED:我找到了原因,因为第一个插入语句失败了,所以为什么返回(0行受影响),在修复插入语句之后,它现在可以工作了。谢谢大家。
答案 0 :(得分:1)
首先验证shipping_attribute_value
实际上是否有identity
列。如果没有标识列,scope_identity()
将无效。
编辑:我错过了insert
实际上正在使用select
,但是marc_s注意到它了:) *抓咖啡*
如何单独选择以查看输出:
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;
如果没有插入行,scope_identity()
应该为null:)