@@IDENTITY--插入记录返回主键

     在没有使用ORM框架的情况下,添加一条新记录想返回主键就得认识一个这个东西@@IDENTITY的用法了(Nhibernate有添加就自己返回主键的方法).
     @@IDENTITY是MSSqlServer返回插入最后一条记录的一个标识值,只有主键值类型为IDENTITY的才有返回值,否则为NULL.
     如下脚本,创建三个表,一个是主表TestIdent,有一个自增主键,两个是子表TestChild1和TestChild2,以TestIdent表的主键来当外键.
     

ContractedBlock.gif ExpandedBlockStart.gif Code
 1ExpandedBlockStart.gifContractedBlock.gif/**//*
 2InBlock.gif    使用@@IDENTITY示例
 3ExpandedBlockEnd.gif*/

 4None.gif
 5None.gifCREATE TABLE TestIdent --建表TestIdent,主健为IDCol
 6None.gif(
 7None.gif    IDCol int IDENTITY PRIMARY KEY
 8None.gif)
 9None.gifCREATE TABLE TestChild1 --建表TestChild1,主健为IDcol,外健为表TestIdent的IDCol
10None.gif(
11None.gif    IDcol int PRIMARY KEY FOREIGN KEY REFERENCES TestIdent(IDCol)
12None.gif)
13None.gifCREATE TABLE TestChild2 --建表TestChild2,主健为IDcol,外健为表TestIdent的IDCol
14None.gif(
15None.gif    IDcol int PRIMARY KEY REFERENCES TestIdent(IDCol)
16None.gif)
17None.gif
18None.gifDECLARE @Ident int
19None.gifINSERT INTO TestIdent DEFAULT VALUES
20None.gif
21None.gifSET @Ident=@@IDENTITY --@@IDENTITY的值为插入表TestIdent最后一条记录的主健值
22None.gif                      --TestIdent表的主健是IDENTITY,所以@@IDENTITY有值
23None.gif
24None.gifPRINT 'The value we got originally from @@IDENTYTY is ' + CONVERT(varchar(2),@Ident)
25None.gifPRINT 'The value currently in @@IDENTITY is ' + CONVERT(varchar(2),@@IDENTITY)
26None.gif
27None.gifINSERT INTO TestChild1 VALUES (@@IDENTITY)
28None.gif 
29None.gifPRINT 'The value we got originally from @@IDENTITY was ' + CONVERT(varchar(2),@Ident)
30None.gif
31None.gifIF(SELECT @@IDENTITYIS NULL
32None.gif    PRINT 'The value currently in @@IDENTITY is NULL'    
33None.gifELSE
34None.gif    PRINT 'The value currently in @@IDENTITY is ' + CONVERT(varchar(2),@@IDENTITY)
35None.gif
36None.gifPRINT ''
37None.gif
38None.gifINSERT INTO TestChild2 VALUES(@@IDENTITY--@@IDENTITY为插入表TestChild1的最后一个记录的主健值
39None.gif                                          --因为TestChild1的主健不是IDENTITY型的,所以@@IDENTITY为空
40None.gif 

 

     运行结果为:
     

ContractedBlock.gif ExpandedBlockStart.gif Code
 1None.gif
 2None.gif(1 行受影响)
 3None.gifThe value we got originally from @@IDENTYTY is 5
 4None.gifThe value currently in @@IDENTITY is 5
 5None.gif
 6None.gif(1 行受影响)
 7None.gifThe value we got originally from @@IDENTITY was 5
 8None.gifThe value currently in @@IDENTITY is NULL
 9None.gif 
10None.gif消息 515,级别 16,状态 2,第 21 行
11None.gif不能将值 NULL 插入列 'IDcol',表 'Test.dbo.TestChild2';列不允许有空值。INSERT 失败。
12None.gif语句已终止。

     

     运行结果第10行错误是因为表TestChild1的主键不是IDENTITY类型的.
      在实际应用中,在INSERT INTO 语句后加上SELECT @@IDENTITY,Command对象就用ExecuteScalar()方法(执行查询,并返回所查询的结果集的第一行第一列,忽略其它行或列),即可返回最新插入记录的主键.使用存储过程也一样.最好的使用说明是在新用户注册后不用再登录就可保存该用户的对象.
     @@IDENTITY就是得到这样一个主键,作用还有很多.

     

转载于:https://www.cnblogs.com/chenzehe/archive/2008/12/19/1358653.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值