2011-01-26 163 views
3

是否有一些SQL編碼可以在點擊獲取默認按鈕時生成唯一標識符?我正在尋找一個系統,在將物理紙質文件放入存儲之前對其進行編號。問題是有3個辦公室,每個辦公室需要一個序號系統(即P001,P002,P003和C001,C002 ...)。使用SQL創建唯一標識符

以下是我目前爲唯一身份證號碼生成前綴的代碼。

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表示年份的文件放置到存儲)

任何指針不勝感激

+1

'sequential'方面有多重要?插入失敗會留下任何空隙嗎? –

+0

不幸的是非常重要 - 因爲當文件從存儲中丟失時(在歸檔之後它們一直被取出),它可以更容易地進行身份識別 - 顯然,如果它們是數字中的空白,那麼您不會知道如果文件丟失或未分配號碼 –

+0

確定完全排除「身份」,那麼根本不能保證這一點(即使您有3個不同的表,您仍然可以從回滾事務中獲得差距) –

回答

11

在SQL Server功能newid()會生成一個GUID

您的SQL查詢不會生成按鈕或其他任何東西。 SQL是一種查詢數據庫的語言,不用於編寫軟件接口。

+0

感謝丹,但我跳槽爲incramental unquie標識符(即0001,0002,0003)是在所有可能? –

+0

是的,創建一個標識列,它將自動生成增量標識符,而無需編寫任何代碼。 –

+0

你能指點我一個有用的教程嗎? –

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 
+0

首先,確認我需要什麼(和我認爲我們現在正在從同一首讚美詩表單中籤名)當一個文件需要歸檔時,每個辦公室都會點擊一個按鈕,並且會連續輸入下一個歸檔編號(然後將其寫入該文件,並將其存入存儲區) ......有時候菲爾斯會從存儲中回來,但我們保留它出來的差距,所以我們知道它的缺失(是否應該有其他人要求)......這有道理嗎?我們是否同意?至於代碼,我沒有第一個想法如何實現到我的系統對不起,超出我目前的理解 –

+0

我有一個遊戲,但可悲的是數據庫不會讓我看到更多的它的自定義feild建造者。 SQL可以在構建器中查看和更改的SQL級別與初始問題中的SQL級別相同。 –

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