不插入行 获得标识

fcfd86 2010-01-08 02:43:43
我用SQL SERVER 2005 作数据库 写一个程序,

我想获得 某一个表 最后插入时的标识, 查询(获得)时,并不进行插入(只查询) 可以吗?

select @@identity

select SCOPE_IDENTITY()

select IDENT_CURRENT(‘table’)

除了这三个方法( 都返回 NULL (因为我没有插入行)), 还有其他方法吗?
...全文
121 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ws_hgo 2010-01-08
  • 打赏
  • 举报
回复
SQL标识列初探
一、标识列的定义以及特点

SQL Server中的标识列又称标识符列,习惯上又叫自增列。
该种列具有以下三种特点:

1、列的数据类型为不带小数的数值类型
2、在进行插入(Insert)操作时,该列的值是由系统按一定规律生成,不允许空值
3、列值不重复,具有标识表中每一行的作用,每个表只能有一个标识列。

由于以上特点,使得标识列在数据库的设计中得到广泛的使用。

二、标识列的组成
创建一个标识列,通常要指定三个内容:
1、类型(type)
在SQL Server 2000中,标识列类型必须是数值类型,如下:
decimal、int、numeric、smallint、bigint 、tinyint
其中要注意的是,当选择decimal和numeric时,小数位数必须为零
另外还要注意每种数据类型所有表示的数值范围

2、种子(seed)
是指派给表中第一行的值,默认为1

3、递增量(increment)
相邻两个标识值之间的增量,默认为1。

三、标识列的创建与修改
标识列的创建与修改,通常在企业管理器和用Transact-SQL语句都可实现,使用企业管理管理器比较简单,请参考SQL Server的联机帮助,这

里只讨论使用Transact-SQL的方法

1、创建表时指定标识列
标识列可用 IDENTITY 属性建立,因此在SQL Server中,又称标识列为具有IDENTITY属性的列或IDENTITY列。
下面的例子创建一个包含名为ID,类型为int,种子为1,递增量为1的标识列
CREATE TABLE T_test
(ID int IDENTITY(1,1),
Name varchar(50)
)

2、在现有表中添加标识列
下面的例子向表T_test中添加一个名为ID,类型为int,种子为1,递增量为1的标识列
--创建表
CREATE TABLE T_test
(Name varchar(50)
)

--插入数据
INSERT T_test(Name) VALUES('张三')

--增加标识列
ALTER TABLE T_test
ADD ID int IDENTITY(1,1)

3、判段一个表是否具有标识列

可以使用 OBJECTPROPERTY 函数确定一个表是否具有 IDENTITY(标识)列,用法:
Select OBJECTPROPERTY(OBJECT_ID('表名'),'TableHasIdentity')
如果有,则返回1,否则返回0

4、判断某列是否是标识列

可使用 COLUMNPROPERTY 函数确定 某列是否具有IDENTITY 属性,用法
SELECT COLUMNPROPERTY( OBJECT_ID('表名'),'列名','IsIdentity')
如果该列为标识列,则返回1,否则返回0

4、查询某表标识列的列名
SQL Server中没有现成的函数实现此功能,实现的SQL语句如下
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.columns
WHERE TABLE_NAME='表名' AND COLUMNPROPERTY(
OBJECT_ID('表名'),COLUMN_NAME,'IsIdentity')=1

5、标识列的引用

如果在SQL语句中引用标识列,可用关键字IDENTITYCOL代替
例如,若要查询上例中ID等于1的行,
以下两条查询语句是等价的
SELECT * FROM T_test WHERE IDENTITYCOL=1
SELECT * FROM T_test WHERE ID=1

6、获取标识列的种子值

可使用函数IDENT_SEED,用法:
SELECT IDENT_SEED ('表名')

7、获取标识列的递增量

可使用函数IDENT_INCR ,用法:
SELECT IDENT_INCR('表名')

8、获取指定表中最后生成的标识值

可使用函数IDENT_CURRENT,用法:
SELECT IDENT_CURRENT('表名')
注意事项:当包含标识列的表刚刚创建,为经过任何插入操作时,使用IDENT_CURRENT函数得到的值为标识列的种子值,这一点在开发数据库应用程序的时候尤其应该注意。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ws_hgo/archive/2009/04/26/4125239.aspx
dawugui 2010-01-08
  • 打赏
  • 举报
回复
[Quote=引用楼主 fcfd86 的回复:]
我用SQL SERVER 2005 作数据库 写一个程序,

我想获得 某一个表 最后插入时的标识, 查询(获得)时,并不进行插入(只查询) 可以吗?

select @@identity

select SCOPE_IDENTITY()

select IDENT_CURRENT(‘table’)

除了这三个方法( 都返回 NULL (因为我没有插入行)), 还有其他方法吗?
[/Quote]
select max(col) from tb
水族杰纶 2010-01-08
  • 打赏
  • 举报
回复
MSSQL2005 INSERT ,UPDATE,DELETE 之OUTPUT子句
http://blog.csdn.net/wufeng4552/archive/2009/10/07/4639733.aspx
水族杰纶 2010-01-08
  • 打赏
  • 举报
回复
declare @t table(ID int identity,[name] varchar(10))
insert @t output inserted.id select 'test'
insert @t output inserted.id select 'test2'
/*
id
-----------
1

(1 個資料列受到影響)

id
-----------
2

(1 個資料列受到影響)
*/
xman_78tom 2010-01-08
  • 打赏
  • 举报
回复

select [name],[seed_value],[increment_value],[last_value]
from sys.identity_columns
where [object_id]=object_id('tabname') and is_identity=1
忆轩辕 2010-01-08
  • 打赏
  • 举报
回复
select max(标识列)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧