SCOPE_IDENTITY() 返回 NULL?
Posted
技术标签:
【中文标题】SCOPE_IDENTITY() 返回 NULL?【英文标题】:SCOPE_IDENTITY() return NULL? 【发布时间】:2010-07-17 08:29:32 【问题描述】:我用的是SQL Server 2008 express,下面是SP,谁返回
(0 行受影响)
消息 515,级别 16,状态 2,程序 sp_AddCarrierFees,
第 21 行不能 将值 NULL 插入列 'attribute_value_id',表 'MyDevSystem.dbo.shipping_fees';
列 不允许空值。插入失败。 声明已终止。
(受影响的 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
有人知道为什么吗?我在 *** 上看了很多帖子,但仍然没有找到解决方案。有人说改用@@IDENTITY 或 IDENT_CURRENT,但它可能得到了其他用户制作的身份。
已修复:我找到了原因,因为第一个插入语句失败,所以为什么返回(0 行受影响),在我修复该插入语句之后,它现在可以工作了。谢谢大家。
【问题讨论】:
你能发布shipping_attribute_value
表的定义吗?
是的,创建表 [dbo].[shipping_attribute_value]( [attribute_value_id] [int] IDENTITY(1,1) NOT NULL, [attribute_id] [int] NOT NULL, [attribute_value] [varchar] (255) 非空,[sort_order] [int] 非空,约束 [PK_shipping_attribute_value] 主键集群([attribute_value_id] ASC)与(PAD_INDEX = OFF,STATISTICS_NORECOMPUTE = OFF,IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
attribute_value_id 是primary_key,自增1
【参考方案1】:
首先验证shipping_attribute_value
实际上有一个identity
列。没有标识列,scope_identity()
不起作用。
编辑:我错过了 insert
实际上使用 select
,但 marc_s 注意到了 :) *grabs coffee*
如何单独选择以查看输出:
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 :)
【讨论】:
以上是关于SCOPE_IDENTITY() 返回 NULL?的主要内容,如果未能解决你的问题,请参考以下文章
而不是 SQL Server 中的触发器丢失 SCOPE_IDENTITY?
而不是SQL Server中的触发器丢失SCOPE_IDENTITY?