sqlserver实现oracle的sequence方法

日期:2020-04-29编辑作者:数据库

当然这点小问题是难不倒我们程序员的,“max+1啊”,有人会说这样的方式。是的,这种方式实现起来也比较简单。当然你也许还会说,最Sql的方式是采用identity列,自增的方式去增加就ok了。但是这样的列如果要实现“YYYYMMDD”+Sequence值 的格式就不行了。还是老老实实用存储过程来取得一个Sequence值吧,使用起来也就随心所欲了。

表复制: 1. INSERT INTO SELECT语句 语句形式为:Insert into Table2(field1,field2,...) select value1,value2,... from Table1 要求目标表Table2必须存在,由于目标表Table2已经存在,所以我们除了插入源表Table1的字段外,还可以插入常量。 示例如下: 复制代码 代码如下: --创建测试表 create TABLE Users1 ( UserID int identity (1,1) primary key not null, UserName varchar(10), UserAddress varchar(20) ) GO create TABLE Users2 ( ID int identity (1,1) primary key not null, Name varchar(10), Address varchar(20) ) GO --创建测试数据 Insert into Users1 values('赵','asds') Insert into Users1 values('钱','asds') Insert into Users1 values('孙','asds') Insert into Users1 values('李','asds') GO select * from Users2 --INSERT INTO SELECT语句复制表数据 Insert into Users2(Name,Address) select UserName,UserAddress from Users1 GO --显示更新后的结果 select * from Users2 GO --删除测试表 drop TABLE Users1 drop TABLE Users2 2. SELECT INTO FROM语句 语句形式为:SELECT vale1, value2 into Table2 from Table1 要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2 示例如下: 复制代码 代码如下: --创建测试表 create TABLE Users1 ( UserID int identity (1,1) primary key not null, UserName varchar(10), UserAddress varchar(20) ) GO --创建测试数据 Insert into Users1 values('赵','asds') Insert into Users1 values('钱','asds') Insert into Users1 values('孙','asds') Insert into Users1 values('李','asds') GO --SELECT INTO FROM语句创建表Users2并复制数据 select UserName,UserAddress INTO Users2 from Users1 GO --显示更新前后的结果 select * from Users1 select * from Users2 GO --删除测试表 drop TABLE Users1 drop TABLE Users2 表更改: 3.ALTER TABLE 语句 ALTER TABLE 语句用于在已有的表中添加、修改或删除列。 语句形式为: 复制代码 代码如下: 在表中添加列 : ALTER TABLE table_name ADD column_name datatype 删除表中的列 ALTER TABLE table_name DROP COLUMN column_name 改变表中列的数据类型 ALTER TABLE table_name ALTER COLUMN column_name datatype 示例如下: 复制代码 代码如下: --创建测试表 create TABLE Users ( UserID int identity (1,1) primary key not null, UserName varchar(10), UserAddress varchar(20) ) GO --在Users表中添加一个名为 "Birthday" 的新列 数据类型为datetime ALTER TABLE Users ADD Birthday datetime GO --在Users表中把 "Birthday" 列的数据类型改为nvarchar(20) ALTER TABLE Users ALTER COLUMN Birthday nvarchar(20) GO --删除 "Person" 表中的 "Birthday" 列: ALTER TABLE Users DROP COLUMN Birthday GO --删除测试表 drop TABLE Users 使用Sp_rename 存储过程[SQLCE不支持] Sp_rename 存储过程可以修改当前数据库中用户对象的名称,如表、列、索引、存储过程等待。但在SqlCe下面测试只能改表名 语法如下: Sp_rename[@objname=]'object_name', [@newname=]'new_name' [,[@objtype=]'object_type'] 其中[@objtype=]'object_type'是要改名的对象的类型,其值可以为 'Column' 列 'Database' 数据库 'Index' 索引 'Userdatatype'用户自定义类型 'Object' 对象 值'Object'指代了系统表sysobjects中所有对象,如表、视图、存储过程、触发器、规则、约束等。'object'值为默认值。 示例如下: 复制代码 代码如下: 例1:更改orders表的列p_id 名称为 products_id exec sp_rename 'orders.[p_id]','product_id','column' 例2: 更改orders表的名称为p_orders exec sp_rename 'orders','p_orders'

网上常见的一个存储过程为 为当前库所有用到Sequence建一张表,譬如“AllSequence”,内含四个字段,创建Sequence的时候就创建一条记录,获取Sequence的时候就从对应行的当前值按递增值增加得到。

在并发性请求不那么高的系统里,这种过程是没有问题的。但是并发性请求一旦处于某个量级以后,这个过程常常会遇到问题。

以下为一个改进方法,适合于高吞吐量的访问请求,比如每秒数千次的请求:

复制代码 代码如下:-- 假定要给T_0101001创建一个Sequence

-- 创建表SeqT_0101001create table SeqT_0101001(

-- ID列为自增列 SeqID int identity(1,1) primary key,

-- Sequence值 SeqVal varchar(1))

-- 创建从SeqT_0101001表获取最新Sequence值的存储过程create procedure P_GetNewSeqVal_SeqT_0101001asbegin -- 声明新Sequence值变量 declare @NewSeqValue int

本文由www.129028.com金沙发布于数据库,转载请注明出处:sqlserver实现oracle的sequence方法

关键词:

SQL Server 2000的安全配置

SQLserver2000数据库应用非常广泛,一旦出现安全问题,造成的损失往往难以估量!应提前预防,防患于未然。这里,我...

详细>>

如何查看某个查询用了多少TempDB空间www.129028.com金沙

DECLARE @read BIGINT, @write BIGINT; SELECT @read = SUM(num_of_bytes_read), @write = SUM(num_of_bytes_written) FROM tempdb.sys.database_files AS DBFJOI...

详细>>

浅析SQL语句中GROUP BY的用法

GROUP BY 是分组查询, 一般 GROUP BY 是和 聚合函数配合使用,你可以想想 你用了GROUP BY 按 ITEM.ITEMNUM这个字段分组,那其他字...

详细>>

微软总是试图使它的软件安装尽可能地简单顺www.129028.com金沙

如果你没有特意记录安装日期,那么有没有办法从SQL Server里查询到呢?想想我们在安装的时候,肯定会有Windows认证登...

详细>>