, 나는 새로운 기록과 CLR (스칼라 반환 함수)를 삽입하는 데이터베이스의 저장 프로 시저를 사용합니다 다음 청구서 번호를 얻으십시오. 이 방법으로 번호가 고유한지 확인할 수 있습니다. 같은
SP가 볼 수 있었다 :
이
CREATE PROCEDURE [dbo].[InsertBill]
@idBill int OUTPUT,
@CreationDate datetime OUTPUT,
@Name varchar(50) OUTPUT,
@BillNumber char(10) OUTPUT
with execute as Owner
AS
INSERT INTO tBill(CreationDate, Name, BillNumber)
VALUES (GetDate(), @Name, dbo.GetNextBillNumber())
;SELECT @idBill=idBill,@CreationDate=CreationDate, @Name=Name, @BillNumber=BillNumber
FROM tBill WHERE (@idBill = SCOPE_IDENTITY())
다음 수는 MAX(BillNumber)+1
것, 형식은 10 개 문자 (A + 9 자리 숫자)이며, 다음 청구 번호를 생성하는 CLR :
CREATE FUNCTION [dbo].[GetNextBillNumber]()
RETURNS CHAR(10)
AS
BEGIN
DECLARE @BillNumber CHAR(10);
DECLARE @nextBillNumber int;
SET @nextBillNumber = CONVERT(int,SUBSTRING((SELECT MAX(BillNumber) FROM tBill),2,9)) + 1;
SET @BillNumber = 'A' + RIGHT('000000000'+ CONVERT(VARCHAR,@nextBillNumber),9)
return @BillNumber
END
을
참고 : 100 % 테스트하지는 않지만 의미하는 바를 이해해야합니다.
편집 : 고유성을 보장하려면 add a unique constraint이어야합니다. 그런 다음 동일한 Bill-Number로 두 개의 레코드를 삽입하는 것은 기술적으로 불가능합니다. 이 예제에서 테이블의 primary-key은 빌 번호 자체가 아니라 Is Identity (자동 증가, here with SSMS) 인 int- 열이라고 가정합니다.
Here은 ADO.NET에서 저장 프로 시저를 호출하는 방법에 대한 정보입니다.
이것은 실제로 명확하지 않습니다. 각 사람에 대해 1 (또는 0)부터 다시 시작하려면 고유 번호가 필요합니까? 또는 어떤 영수증과 상관없이 각 영수증에 대해 지속적으로 증분되는 별도의 고유 번호입니까? 당신은 DB에서 유일한 인덱스를 사용할 수 있고, 당신이하려고하는 것이면 그것이 더 큰 숫자를 얻고 증가시키는 함수를 가질 수 있습니다,하지만 그것이 당신이 요구하는 것과 정확히 일치하지는 않습니다. –
어떤 데이터베이스를 사용하고 있습니까? –