首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

数据列的自动生成默认值的有关问题

2012-02-12 
数据列的自动生成默认值的问题我想在数据库中的某列依次存储20070001,20070002等,而到了2008年,又变成了20

数据列的自动生成默认值的问题
我想在数据库中的某列依次存储20070001,20070002等,而到了2008年,又变成了2008001,2008002,这可以在数据库中设置成默认值吗?如果可以怎么设?

[解决办法]
1.
没有内置 API 支持此功能

2.
通过自定义函数可以实现

->

/*
* 测试表
*/
CREATE TABLE [dbo].[CustomIDTest] (
[ID] [int] NOT NULL ,
[Code] [char] (8) NOT NULL
)

/*
* 功能:按 YYYYxxxx 格式生成目标年份的最大编码,数据类型为 CHAR(8)
* 说明:特定表范围内有效
* 未处理溢出情况(当表中某年值已达到YYYY9999)
*/
CREATE FUNCTION dbo.GenCustomCode(
@Year INT
)
RETURNS CHAR(8)
AS
BEGIN

DECLARE
@Code CHAR(8),
@MinCodeInYear CHAR(8),
@MaxCodeInYear CHAR(8)

SELECT @MinCodeInYear = CONVERT(CHAR(4), @Year) + '0001 ', @MaxCodeInYear = CONVERT(CHAR(4), @Year) + '9999 '

SELECT @Code = MAX(Code) FROM CustomIDTest WHERE Code > = @MinCodeInYear AND Code <= @MaxCodeInYear
IF @Code IS NOT NULL AND @Year = CONVERT(INT, SUBSTRING(@Code, 1, 4))
/*IF @Code = @MaxCodeInYear 溢出处理*/
SET @Code = CONVERT(INT, @Code) + 1
ELSE
SET @Code = @MinCodeInYear

RETURN @Code

END

/*
* 功能:按 YYYYxxxx 格式生成目标年份的最大ID,数据类型为 INT
* 说明:特定表范围内有效
* 未处理溢出情况(当表中某年值已达到YYYY9999)
*/
CREATE FUNCTION dbo.GenCustomID(
@Year INT
)
RETURNS INT
AS
BEGIN

DECLARE
@ID INT,
@MinIDInYear INT,
@MaxIDInYear INT

SELECT @MinIDInYear = @Year*10000 + 1, @MaxIDInYear = @Year*10000 + 9999

SELECT @ID = MAX(ID) FROM CustomIDTest WHERE ID > = @MinIDInYear AND ID <= @MaxIDInYear
IF @ID IS NOT NULL AND @Year = @ID/10000
/*IF @ID = @MaxIDInYear 溢出处理*/
SET @ID = @ID + 1
ELSE
SET @ID = @MinIDInYear

RETURN @ID

END

-- 测试
-- 自定义年份内自增
INSERT INTO CustomIDTest([ID], [Code])
SELECT dbo.GenCustomID(DatePart(YY, DATEADD(YY, -1, GetDate()))), dbo.GenCustomCode(DatePart(YY, DATEADD(YY, -1, GetDate())))
UNION
SELECT dbo.GenCustomID(DatePart(YY, GetDate())), dbo.GenCustomCode(DatePart(YY, GetDate()))
UNION
SELECT dbo.GenCustomID(DatePart(YY, DATEADD(YY, 1, GetDate()))), dbo.GenCustomCode(DatePart(YY, DATEADD(YY, 1, GetDate())))

SELECT * FROM CustomIDTest

热点排行
Bad Request.