Trong quá trình thiết kế Cơ sở dữ liệu, để lưu trữ, chúng ta sẽ cần dùng đến những mã tự động tăng để việc quản lý được dễ dàng hơn. Không chỉ vậy, các mã tự động tăng trong SQL luôn có một ý nghĩa riêng mà khi đọc mã chúng ta có thể hiểu hết một dòng dữ liệu theo mã đó.
1. Kiểu chữ cái trước và số sau: “KH001 > KH002 > … > KH999”
Function:
CREATE FUNCTION AUTO_IDKH() RETURNS VARCHAR(5) AS BEGIN DECLARE @ID VARCHAR(5) IF (SELECT COUNT(MAKH) FROM KHACHHANG) = 0 SET @ID = '0' ELSE SELECT @ID = MAX(RIGHT(MAKH, 3)) FROM KHACHHANG SELECT @ID = CASE WHEN @ID >= 0 and @ID < 9 THEN 'KH00' + CONVERT(CHAR, CONVERT(INT, @ID) + 1) WHEN @ID >= 9 THEN 'KH0' + CONVERT(CHAR, CONVERT(INT, @ID) + 1) END RETURN @ID END
Sử dụng: Thiết lập mặc định hàm DBO.AUTO_IDKH() cho trường MAKH
CREATE TABLE KHACHHANG( MAKH CHAR(5) PRIMARY KEY CONSTRAINT IDKH DEFAULT DBO.AUTO_IDKH(), HOTEN NVARCHAR(50) NOT NULL, SDT VARCHAR(11) NULL, DIACHI NVARCHAR(100) NULL, EMAIL VARCHAR(50) NULL )
Các bạn có thể tăng chiều dài mã bằng cách khai báo tăng chiều dài của MAKH và thêm nhiều nhánh CASE hơn.
2. Kiểu chỉ bao gồm chữ cái: AAAA > AAAB > … > ZZZZZ
Function:
CREATE FUNCTION TAOMAVE(@BEFORECODE CHAR(6))---65->90 RETURNS CHAR(6) AS BEGIN DECLARE @ONE AS SMALLINT, @TWO SMALLINT, @THREE SMALLINT, @FOUR SMALLINT, @FIVE SMALLINT, @SIX SMALLINT DECLARE @MAVE CHAR(6) SELECT @ONE=ASCII(LEFT(@BEFORECODE,1)) SELECT @TWO=ASCII(SUBSTRING(@BEFORECODE,2,1)) SELECT @THREE=ASCII(SUBSTRING(@BEFORECODE,3,1)) SELECT @FOUR=ASCII(SUBSTRING(@BEFORECODE,4,1)) SELECT @FIVE=ASCII(SUBSTRING(@BEFORECODE,5,1)) SELECT @SIX=ASCII(RIGHT(@BEFORECODE,1)) IF @SIX<90 SELECT @SIX=@SIX+1 ELSE BEGIN SELECT @SIX=65 IF @FIVE<90 SELECT @FIVE=@FIVE+1 ELSE BEGIN SELECT @FIVE=65 IF @FOUR<90 SELECT @FOUR=@FOUR+1 ELSE BEGIN SELECT @FOUR=65 IF @THREE<90 SELECT @THREE=@THREE+1 ELSE BEGIN SELECT @THREE=65 IF @TWO<90 SELECT @TWO=@TWO+1 ELSE BEGIN SELECT @TWO=65 IF @ONE<90 SELECT @ONE=@ONE+1 ELSE RETURN NULL END END END END END SELECT @MAVE=CHAR(@ONE)+CHAR(@TWO)+CHAR(@THREE)+CHAR(@FOUR)+CHAR(@FIVE)+CHAR(@SIX) RETURN @MAVE END
Sử dụng: Có thể gọi trong Procedure hoặc từ ứng dụng kết nối với Cơ sở dữ liệu
3. Kiểu Ngày Tháng Năm + Chữ cái + Số tự động tăng: 01012001DV00001 > 02012001DV00002
Function:
CREATE FUNCTION auto_iddv() RETURNS VARCHAR(15) AS BEGIN DECLARE @id VARCHAR(15) IF (SELECT COUNT(MaDV) FROM DATVE) = 0 SET @id = '0' ELSE SELECT @id = MAX(RIGHT(MaDV, 5)) FROM DATVE SELECT @id = CASE WHEN @id = 99999 THEN CONVERT(VARCHAR,GETDATE(),112) + 'DV00001' WHEN @id >= 0 and @id < 9 THEN CONVERT(VARCHAR,GETDATE(),112) + 'DV0000' + CONVERT(CHAR, CONVERT(INT, @id) + 1) WHEN @id >= 9 THEN CONVERT(VARCHAR,GETDATE(),112) + 'DV000' + CONVERT(CHAR, CONVERT(INT, @id) + 1) WHEN @id >= 99 THEN CONVERT(VARCHAR,GETDATE(),112) + 'DV00' + CONVERT(CHAR, CONVERT(INT, @id) + 1) WHEN @id >= 999 THEN CONVERT(VARCHAR,GETDATE(),112) + 'DV0' + CONVERT(CHAR, CONVERT(INT, @id) + 1) WHEN @id >= 9999 THEN CONVERT(VARCHAR,GETDATE(),112) + 'DV' + CONVERT(CHAR, CONVERT(INT, @id) + 1) END RETURN @id END
Sử dụng: Các bạn sử dụng tương tự như Kiểu 1
Mình đang tiếp tục cập nhật tiếp một số Funtion hữu ích khác… Theo dõi nhé các bạn!
Em thấy hay ó nhưng mà tới kh999 qua khác hàng 1000 không còn đúng nữa
Chỉ chèn một lần một hàng thôi ak ad , chèn nhiều dòng nó bị lỗi là do sao ạ
cho mình hỏi,Function( Kiểu Ngày Tháng Năm + Chữ cái + Số tự động tăng: 01012001DV00001 > 02012001DV00002) thiết lập qua ngày mới bắt đầu từ số 1 lại thì viết sao admin. Admin có thể hướng dẫn mình không. Xin cảm ơn
làm thế nào để bỏ nó vào nút thêm trong c# ấy ạ
Bạn viết hàm gọi Function trong SQL nha. Tham khảo thêm link này nha: Calling SQL Defined function in C# – Stack Overflow
bị lỗi ạ??
Sau khi làm theo y hệt mà vẫn phải tự thêm tay mã chính anh ơi,
Bạn cần chèn vào lệnh insert hoặc gọi bằng lệnh nào đó khác thì hàm mới hoạt động nha.
anh có thể chị em gọi lệnh được không ạ
Em coppy y code của anh về SQL excute thành công. nhưng khi thêm dữ liệu bị lỗi nay là sao anh ?
Msg 213, Level 16, State 1, Line 23
Column name or number of supplied values does not match table definition.
Cho mình hỏi: Giờ mình có ID tự tăng, làm sao sau khi xóa 1 dòng xong , mình chèn vào nó vào số tiếp theo:
Ví dụ: ID 10,11,12
Giờ xóa 12 xong mình chèn lại nó vào 13. Làm sao để khi chèn lại nó vào 12 chứ k phải 13 ạ
Để làm được như vậy thì bạn phải khai báo kểu ID là kểu số bình thường, không tự động tăng. Sau đó bạn viết một triger hoặc một hàm để tự động cập nhật ID khi bạn insert thêm 1 row, quy trình của hàm này sẽ lấy giá trị cột ID cuối cùng cộng thêm 1 đơn vị rồi chèn vào row bạn đang insert 🙂
bạn sử dụng như thế nào mà id tự tăng được vậy ạ? mình có dùng code ở trên và insert bth nhưng id không tự tăng
Alo admin để hàm AUTO_IDKH() trong Defaulvalueorbiling của col ID(nvarchar) thì chỉ thêm được 1 bản ghi đầu tiên có ID =KH0012 còn các bản ghi sau toàn ID là dbo.AUTO_IDKH()
Thường thì ID thì bạn không nên để NVARCHAR nhé. Hàm AUTO_IDKH() chỉ hoạt động với khai báo kiểu VARCHAR, thì kiểu khai báo ID của bạn phải cùng kểu với hàm, nếu không cùng kiểu hàm sẽ không hoạt động được nha 🙂