使用SQL创建唯一标识符

时间:2011-01-26 10:08:20

标签: sql sql-server

是否有一些SQL编码可以在点击获取默认按钮时生成唯一标识符?我正在寻找一个系统,在物理纸质文件存入存储之前对其进行编号。问题是有3个办公室,每个办公室都需要一个序号系统(即P001,P002,P003和C001,C002 ......)。

以下是我到目前为止为唯一身份证号码生成前缀的代码。

SELECT CASE WHEN ptBranch=3 THEN 'P' WHEN ptBranch=4 THEN 'A' ELSE 'C' END + CONVERT(VARCHAR(2),GETDATE(),12) FROM LAMatter WHERE ptMatter = $Matter$

想法是代码可以生成整个文件号,例如P110001,P110002(其中P,C或A表示文件所在的办公室,11表示文件存入存储的年份)

任何指针都非常赞赏

3 个答案:

答案 0 :(得分:11)

SQL Server函数newid()将生成GUID

您的SQL查询不会生成按钮或其他任何内容。 SQL是一种用于查询数据库的语言,而不是用于编写软件接口的语言。

答案 1 :(得分:0)

我认为这个问题的初步措辞可能会引起误解。

我现在设想您需要一个流程,每个办公室每次处理文件时,只需点击一下按钮就能生成新的保证序号?

然后跟踪序列中的任何间隙以调查潜在的丢失文件。这是对的吗?

如果是这样,你可以使用这样的东西来生成数字。

CREATE TABLE Sequences
(
OfficeCode char(1) primary key,
SequenceNumber int NOT NULL DEFAULT (0)
)

INSERT INTO Sequences(OfficeCode)
SELECT 'P' UNION ALL SELECT 'C' UNION ALL SELECT 'A'

GO

CREATE PROC dbo.GetSequence
@OfficeCode char(1),
@val AS int OUTPUT,
@n as int =1
AS
UPDATE dbo.Sequences 
SET @val = SequenceNumber = SequenceNumber + @n
WHERE OfficeCode = @OfficeCode;

SET @val = @val - @n + 1; 

GO


DECLARE @val  int

EXEC dbo.GetSequence 'C', @val output
select @val

答案 2 :(得分:0)

我将row_number函数与创建日期一起使用。如果你是批量插入,那么你也想要通过row_number函数中的id列进行排序。

declare @records table (id int identity(1,1), CreationDate datetime, Name varchar(50), Section char(1), FileID varchar(10))

insert into @records (CreationDate, Name, Section)
select '2011-01-26 16:57:49', 'abc','p'

insert into @records (CreationDate, Name, Section)
select '2011-01-26 16:57:50', 'def','p'

insert into @records (CreationDate, Name, Section)
select '2011-01-26 16:58:00', 'ghi','c'

insert into @records (CreationDate, Name, Section)
select '2011-01-26 16:58:50', 'jkl','d'

insert into @records (CreationDate, Name, Section)
select '2011-01-26 16:58:51', 'mno','c'

insert into @records (CreationDate, Name, Section)
select '2011-01-26 16:58:52', 'pqr','p'

insert into @records (CreationDate, Name, Section)
select '2011-01-26 16:58:53', 'def','p'

update @records
set FileID=a.FileID
from 
(
    select id,
    Section + cast(row_number() over (partition by Section order by CreationDate, Section) as varchar(10)) as FileID
    from @records
) a
    inner join @records b
        on a.id=b.id

select * from @records