关于字符型自增主键

link1130 2009-01-04 09:38:10
我想用存储过程
但不会用
请老师给我一个例子好吗
像D20080001
D20080002

其中'2008'想调用SQL SERVER的时间

PS:我没积分啊...会不会没人理..
...全文
325 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
link1130 2009-01-04
  • 打赏
  • 举报
回复
CREATE TABLE tb(
BH varchar(12) PRIMARY KEY DEFAULT dbo.f_NextBH(),
col int)
这句话的意思是给表添加关联的函数吗?

那么我要给指定的表添加函数 应该怎么写呢?
假设表名为TD TD表已经建好了
link1130 2009-01-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 happyflystone 的回复:]
CREATE VIEW v_GetDate
AS
SELECT dt=CONVERT(CHAR(4),GETDATE(),120)
GO

--得到新编号的函数
CREATE FUNCTION f_NextBH()
RETURNS varchar(12)
AS
BEGIN
DECLARE @dt CHAR(4)
SELECT @dt=dt FROM v_GetDate
RETURN(
SELECT 'D'+@dt+RIGHT(10001+ISNULL(RIGHT(MAX(BH),3),0),3)
FROM tb WITH(XLOCK,PAGLOCK)
WHERE BH like 'D'+@dt+'%')
END
GO

--在…
[/Quote]
太感谢老大..问题解决..虽然还有很多参数不太懂.-_-!
-狙击手- 2009-01-04
  • 打赏
  • 举报
回复
CREATE VIEW v_GetDate
AS
SELECT dt=CONVERT(CHAR(4),GETDATE(),120)
GO

--得到新编号的函数
CREATE FUNCTION f_NextBH()
RETURNS varchar(12)
AS
BEGIN
DECLARE @dt CHAR(4)
SELECT @dt=dt FROM v_GetDate
RETURN(
SELECT 'D'+@dt+RIGHT(10001+ISNULL(RIGHT(MAX(BH),3),0),3)
FROM tb WITH(XLOCK,PAGLOCK)
WHERE BH like 'D'+@dt+'%')
END
GO

--在表中应用函数
CREATE TABLE tb(
BH varchar(12) PRIMARY KEY DEFAULT dbo.f_NextBH(),
col int)

--插入资料
INSERT tb(col) VALUES(1)
INSERT tb(col) VALUES(2)
INSERT tb(col) VALUES(3)
DELETE tb WHERE col=3
INSERT tb(col) VALUES(4)
INSERT tb(BH,col) VALUES(dbo.f_NextBH(),14)

--显示结果
SELECT * FROM tb

drop table tb
drop function f_NextBH
drop view v_GetDate
/*--结果
BH col
------------ -----------
D2009001 1
D2009002 2
D2009003 4
D2009004 14

(4 行受影响)


--*/
-晴天 2009-01-04
  • 打赏
  • 举报
回复
declare @id int
set @id=5
select 'D'+convert(varchar(4),getdate(),120)+right('00000'+convert(varchar,@id),5) as dh
/*
dh
-----
D200900005

(1 行受影响)
*/

-晴天 2009-01-04
  • 打赏
  • 举报
回复
select 'D'+convert(varchar(4),getdate(),120) as dh
/*
dh
-----
D2009

(1 行受影响)
*/
dawugui 2009-01-04
  • 打赏
  • 举报
回复
Id, FormatId, F1 ,F2
Id序号我设了自动加一,FormatId我想他也象这样"SL000001",
当Insert时就加1,FormatId我想他也能自动加一"SL000001","SL000002"...
能用一条sql什么办法实现.最好不要用中间表。有什么好方法?
谢谢!


create table #test
(id int identity,
FormatId as 'SL'+right(10000000+id,6),
F1 varchar(50))
go
insert #test(F1) select '1'
union all select '2'


select * from #test

drop table #test


/*
id FormatId F1
----------- -------------- -----
1 SL000001 1
2 SL000002 2

(所影响的行数为 2 行)
*/
link1130 2009-01-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 liangCK 的回复:]
SQL code--以下代码生成的编号长度为12,前6位为日期信息,格式为YYMMDD,后6位为流水号。
--创建得到当前日期的视图
CREATE VIEW v_GetDate
AS
SELECT dt=CONVERT(CHAR(6),GETDATE(),12)
GO

--得到新编号的函数
CREATE FUNCTION f_NextBH()
RETURNS char(12)
AS
BEGIN
DECLARE @dt CHAR(6)
SELECT @dt=dt FROM v_GetDate
RETURN(
SELECT @dt+RIGHT(1000001+ISNULL(RIGHT(MAX(BH),6),0),6) …
[/Quote]
谢谢啊~只要显示年份该怎么改?我要在前面加个参数呢? 如D20080001 加个D
-狙击手- 2009-01-04
  • 打赏
  • 举报
回复
create proc pr_test
as
begin
select 'D'+ltrim(datepart(yy,getdate()))+'0001'
end
go
exec pr_test
/*
-----------------
D20090001

(1 行受影响)


*/
drop proc pr_test
liangCK 2009-01-04
  • 打赏
  • 举报
回复
--以下代码生成的编号长度为12,前6位为日期信息,格式为YYMMDD,后6位为流水号。
--创建得到当前日期的视图
CREATE VIEW v_GetDate
AS
SELECT dt=CONVERT(CHAR(6),GETDATE(),12)
GO

--得到新编号的函数
CREATE FUNCTION f_NextBH()
RETURNS char(12)
AS
BEGIN
DECLARE @dt CHAR(6)
SELECT @dt=dt FROM v_GetDate
RETURN(
SELECT @dt+RIGHT(1000001+ISNULL(RIGHT(MAX(BH),6),0),6)
FROM tb WITH(XLOCK,PAGLOCK)
WHERE BH like @dt+'%')
END
GO

--在表中应用函数
CREATE TABLE tb(
BH char(12) PRIMARY KEY DEFAULT dbo.f_NextBH(),
col int)

--插入资料
INSERT tb(col) VALUES(1)
INSERT tb(col) VALUES(2)
INSERT tb(col) VALUES(3)
DELETE tb WHERE col=3
INSERT tb(col) VALUES(4)
INSERT tb(BH,col) VALUES(dbo.f_NextBH(),14)

--显示结果
SELECT * FROM tb
/*--结果
BH col
------------------- -----------
050405000001 1
050405000002 2
050405000003 4
050405000004 14
--*/

34,591

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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