我想在數據庫中的某列依次存儲20070001,20070002等,而到了2008年,又變成了2008001,2008002,這可以在數據庫中設置成默認值嗎?如果可以怎么設? http://community.csdn.net/Expert/TopicView3.asp?id=5696192
/**//*
* 測試表
*/
CREATE TABLE [dbo].[CustomIDTest] (
[ID] [int] NOT NULL ,
[Code] [char] (8) NOT NULL
)
/**//*
* 功能:按 YYYYxxxx 格式生成目標年份的最大編碼,數據類(lèi)型為 CHAR(8)
* 說(shuō)明:特定表范圍內有效
* 未處理溢出情況(當表中某年值已達到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,數據類(lèi)型為 INT
* 說(shuō)明:特定表范圍內有效
* 未處理溢出情況(當表中某年值已達到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 結果
ID Code
----------- --------
20060001 20060001
20060002 20060002
20060003 20060003
20060004 20060004
20070001 20070001
20070002 20070002
20070003 20070003
20070004 20070004
20080001 20080001
20080002 20080002
20080003 20080003
20080004 20080004 說(shuō)明:
1、對于此示例,一年內最大增量只有,9999,需要考慮溢出如何處理,此版本未處理
2、因此,根據實(shí)際需求,我們可以選擇以“天”為編碼前綴,并且擴大自增部分長(cháng)度,避免溢出,
3、當然此時(shí)得考慮,使用 INT 型長(cháng)度是否足夠
4、此版本自定義函數,使用傳入年份參數
5、若欲始終使用當前系統日期,而不顯示指定年份,則需要建立一視圖來(lái)獲取當前日期(因SQLServer中標量函數,不能使用 GetDate() 這樣的非標量函數)