Sıra numaraları
Bir sıra sıra ile oluşturulduğu belirtimine göre sayısal değerler dizisi oluşturan kullanıcı tanımlı bir şemaya bağlı nesnesidir. Sayısal değerler dizisi, artan veya azalan bir tanımlı aralıklarla oluşturulur ve istendiği gibi (tekrar) döngüsü. Sıraları, kimlik sütunlarının, aksine tablo ile ilişkili değildir. Uygulama sonraki değerini almak için bir sıra nesnesine başvurur. Dizileri ve tablolar arasında ilişki uygulama tarafından denetlenir. Kullanıcı uygulamaları, bir sıra nesnesi başvuru ve birden çok satır ve tablo değerleri tuşları koordine etmek.
Bir dizi bağımsız tablolar kullanılarak oluşturulan Sıra oluşturmak deyimi. Seçenekleri artışı, başlangıç noktası, otomatik yeniden başlatma yeteneği ve performansını artırmak için önbelleğe alma, maksimum ve minimum değerleri denetlemenize olanak sağlar. Seçenekler hakkında daha fazla bilgi için bkz: Sıra oluşturmak.
Satır eklendiğinde oluşturulur, kimlik sütun değerleri bir uygulama sonraki sıra numarasını arayarak satır eklemeden önce elde edebilirsiniz Sonraki değer için işlevi. SONRAKİ değeri için bile numarasını hiç bir tabloya eklenen çağrıldığında sıra numarası tahsis edilir. SONRAKİ değeri için işlevi bir tablo tanımında bir sütun için varsayılan değer olarak kullanılabilir. Kullanım sp_sequence_get_range aynı anda birden fazla sıra numaraları aralığı almak için.
Bir sıra herhangi bir tamsayı veri türü olarak tanımlanabilir. Varsayılan veri türü belirtilmezse, bir dizi olarak bigint.
Dizileri kullanarak
Kimlik sütunları aşağıdaki senaryolarda yerine diziler kullanın:
Tabloya ekleme yapılmadan önce uygulamanın bir sayı gerekir.
Uygulama, tek bir dizi numarası birden fazla tablo veya tablo içindeki birden çok sütun arasında paylaşımını gerektirir.
Belirtilen ulaşıldığında uygulama numara serisini yeniden başlatmanız gerekir. Örneğin, değerleri 1 ile 10 arasındaki atadıktan sonra uygulama atama değerleri 1 ile 10 tekrar başlar.
Uygulama, başka bir alana göre sıralanacak dizi değerleri gerektirir. SONRAKİ değeri için işlevi, işlev çağrısı ÜZERINDEN yan tümcesi uygulayabilirsiniz. ÜZERINDEN yan tümcesi döndürülen değerleri ÜZERINDEN yan tümcesi'nın order by yan sırasına göre oluşturulan garanti eder.
Bir uygulama, aynı zamanda atanması birden çok numara gerektirir. Örneğin, bir uygulama beş Sıralı numaralar ayırmak gerekiyor. Eğer diğer işlemler aynı anda numaraları verilmiş kimlik değerleri isteyen serisindeki boşluklar neden olabilir. Arayan sp_sequence_get_rangesırada birkaç numaraları birden alabilir.
Artış değeri gibi sıra tayini değiştirmeniz gerekir.
Sınırlamaları
Kimlik sütun değerleri değiştirilemez,, sıra değerleri otomatik olarak içine tablo ekleme sonra korunmaz. Sıra değerlerin değiştirilmesini önlemek için değişiklikleri geri almak için masaya update tetikleyici kullanın.
Benzersizlik için sıra değerleri otomatik olarak zorlanmaz. Sıra değerleri yeniden kullanma olanağı, tasarımdan kaynaklanmaktadır. Sıra değerleri tabloda benzersiz olması gerekir, sütun üzerinde benzersiz bir dizin oluşturun. Sıra değerleri tablo tablo grubu benzersiz olması gerekir, Tetikleyiciler update deyimleri ya da sıra numarası Bisiklete neden çoğaltmaları önlemek için oluşturun.
Sayı tanımına göre sırası nesnesi oluşturur, ancak sıra nesne numaraları nasıl kullanıldığını kontrol etmez. Bir tabloya eklenen numaralarında boşluklar bir sıra nesnesi birden çok tabloları tarafından paylaşıldığında bir işlem geri alınır veya tabloları kullanmadan sıra numaraları tahsis olabilir. ÖNBELLEK seçeneği ile oluşturduğunuzda, bir güç kesintisi gibi beklenmeyen bir kapatma önbellek numaralarında kaybedebilir.
Tipik kullanımı
Artırır 1 2.147.483.648 ile 2.147.483.647 arasında bir tamsayı sıra numarası oluşturmak için aşağıdaki deyimi kullanın.
CREATE SEQUENCE Schema.SequenceName
AS int
INCREMENT BY 1 ;
Benzer 1 1 ile 2.147.483.647 arasında artıran kimlik sütunu bir tamsayı dizisi oluşturmak için aşağıdaki deyimi kullanın.
CREATE SEQUENCE Schema.SequenceName
AS int
START WITH 1
INCREMENT BY 1 ;
Sıraları yönetme
Serileri hakkında daha fazla bilgi için sorgu sys.sequences.
Örnekler
Konular ek örnekler vardır SIRA (Transact-sql) oluştur, SONRAKİ değeri (Transact-sql), ve sp_sequence_get_range.
A.Tek bir tabloda bir sıra numarası kullanma
Aşağıdaki örnek, adlı bir şema oluşturur Test, adlı bir tablo Ordersve adında bir sıra CountBy1ve sonraki değeri için işlevini kullanarak tabloya satır ekleyen.
--Create the Test schema
CREATE SCHEMA Test ;
GO
-- Create a table
CREATE TABLE Test.Orders
(OrderID int PRIMARY KEY,
Name varchar(20) NOT NULL,
Qty int NOT NULL);
GO
-- Create a sequence
CREATE SEQUENCE Test.CountBy1
START WITH 1
INCREMENT BY 1 ;
GO
-- Insert three records
INSERT Test.Orders (OrderID, Name, Qty)
VALUES (NEXT VALUE FOR Test.CountBy1, 'Tire', 2) ;
INSERT test.Orders (OrderID, Name, Qty)
VALUES (NEXT VALUE FOR Test.CountBy1, 'Seat', 1) ;
INSERT test.Orders (OrderID, Name, Qty)
VALUES (NEXT VALUE FOR Test.CountBy1, 'Brake', 1) ;
GO
-- View the table
SELECT * FROM Test.Orders ;
GO
Sonuç kümesi buradadır.
OrderID Name Qty
1 Tire 2
2 Seat 1
3 Brake 2
B.SONRAKİ değeri için bir satır eklemeden önce arama
Kullanarak Ordersa, aşağıdaki örnek, adlı bir değişken bildirir tablo oluşturulan @nextIDve sonraki değeri için işlevini değişken için sonraki kullanılabilir sıra numarasını ayarlamak için. Uygulamanın müşteriyle sağlama gibi düzenin bazı işlemleri yapmak için kabul edilir OrderIDonların potansiyel sipariş numarası ve sipariş doğrular. Bu işlem nasıl uzun sürebilir veya kaç sipariş sürecinde eklenen olursa olsun, orijinal numarasını kullanmak için bu bağlantı tarafından korunur. Son olarak, INSERTdeyimi ekler siparişi Orderstablosu.
DECLARE @NextID int ;
SET @NextID = NEXT VALUE FOR Test.CountBy1;
-- Some work happens
INSERT Test.Orders (OrderID, Name, Qty)
VALUES (@NextID, 'Rim', 2) ;
GO
C.Bir sıra numarası içinde birden fazla tablo kullanma
Bu örnek, bir üretim hattı izleme işlemi bildirim atölye meydana gelen olayları aldığını varsayar. Her olayın benzersiz alır ve tekdüze artan EventIDnumara. Tüm olayları kullanma ayni EventIDsıra numarası böylece tüm olayları bir araya getiren raporları her olayın benzersiz tanımlayabilirsiniz. Ancak olay verileri olay türüne bağlı olarak üç farklı tablolarda depolanır. Kod örneği adlı bir şema oluşturur Audit, adlı bir dizi EventCounter, ve üç olan her kullanım tabloları EventCountersıra varsayılan değer olarak. Sonra örnek üç tablolara satırlar ekler ve sonuçları sorgular.
CREATE SCHEMA Audit ;
GO
CREATE SEQUENCE Audit.EventCounter
AS int
START WITH 1
INCREMENT BY 1 ;
GO
CREATE TABLE Audit.ProcessEvents
(
EventID int PRIMARY KEY CLUSTERED
DEFAULT (NEXT VALUE FOR Audit.EventCounter),
EventTime datetime NOT NULL DEFAULT (getdate()),
EventCode nvarchar(5) NOT NULL,
Description nvarchar(300) NULL
) ;
GO
CREATE TABLE Audit.ErrorEvents
(
EventID int PRIMARY KEY CLUSTERED
DEFAULT (NEXT VALUE FOR Audit.EventCounter),
EventTime datetime NOT NULL DEFAULT (getdate()),
EquipmentID int NULL,
ErrorNumber int NOT NULL,
EventDesc nvarchar(256) NULL
) ;
GO
CREATE TABLE Audit.StartStopEvents
(
EventID int PRIMARY KEY CLUSTERED
DEFAULT (NEXT VALUE FOR Audit.EventCounter),
EventTime datetime NOT NULL DEFAULT (getdate()),
EquipmentID int NOT NULL,
StartOrStop bit NOT NULL
) ;
GO
INSERT Audit.StartStopEvents (EquipmentID, StartOrStop)
VALUES (248, 0) ;
INSERT Audit.StartStopEvents (EquipmentID, StartOrStop)
VALUES (72, 0) ;
INSERT Audit.ProcessEvents (EventCode, Description)
VALUES (2735,
'Clean room temperature 18 degrees C.') ;
INSERT Audit.ProcessEvents (EventCode, Description)
VALUES (18, 'Spin rate threashold exceeded.') ;
INSERT Audit.ErrorEvents (EquipmentID, ErrorNumber, EventDesc)
VALUES (248, 82, 'Feeder jam') ;
INSERT Audit.StartStopEvents (EquipmentID, StartOrStop)
VALUES (248, 1) ;
INSERT Audit.ProcessEvents (EventCode, Description)
VALUES (1841, 'Central feed in bypass mode.') ;
-- The following statement combines all events, though not all fields.
SELECT EventID, EventTime, Description FROM Audit.ProcessEvents
UNION SELECT EventID, EventTime, EventDesc FROM Audit.ErrorEvents
UNION SELECT EventID, EventTime,
CASE StartOrStop
WHEN 0 THEN 'Start'
ELSE 'Stop'
END
FROM Audit.StartStopEvents
ORDER BY EventID ;
GO
Sonuç kümesi buradadır.
EventID EventTime Description
1 2009-11-02 15:00:51.157 Start
2 2009-11-02 15:00:51.160 Start
3 2009-11-02 15:00:51.167 Clean room temperature 18 degrees C.
4 2009-11-02 15:00:51.167 Spin rate threshold exceeded.
5 2009-11-02 15:00:51.173 Feeder jam
6 2009-11-02 15:00:51.177 Stop
7 2009-11-02 15:00:51.180 Central feed in bypass mode.
D.Sıra numaraları sonuç yinelenen üreten ayarla
Aşağıdaki örnek sıra numaraları iki özellik gösterir: Bisiklete binme ve kullanma NEXT VALUE FORbir select deyimi içinde.
CREATE SEQUENCE CountBy5
AS tinyint
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 5
CYCLE ;
GO
SELECT NEXT VALUE FOR CountBy5 AS SurveyGroup, Name FROM sys.objects ;
GO
E.Sıra numaraları bir sonuç üreten ÜZERINDEN yan tümcesi kullanarak ayarlama
Aşağıdaki örnek OVERsonuç kümesi sıralamak için yan Namesıra numarası sütun ekler önce.
USE AdventureWorks2012 ;
GO
CREATE SCHEMA Samples ;
GO
CREATE SEQUENCE Samples.IDLabel
AS tinyint
START WITH 1
INCREMENT BY 1 ;
GO
SELECT NEXT VALUE FOR Samples.IDLabel OVER (ORDER BY Name) AS NutID, ProductID, Name, ProductNumber FROM Production.Product
WHERE Name LIKE '%nut%' ;
F.Sıra numarasını sıfırlama
Örnek e tüketilen, ilk 79 Samples.IDLabelsıra numaraları. (Senin yorum-in AdventureWorks2012farklı sayıda sonuç döndürebilir.) Sonraki 79 numaralarında tüketmek için aşağıdaki yürütme (80 olsa 158).
SELECT NEXT VALUE FOR Samples.IDLabel OVER (ORDER BY Name) AS NutID, ProductID, Name, ProductNumber FROM Production.Product
WHERE Name LIKE '%nut%' ;
Yeniden başlatmak için aşağıdaki deyimi yürütme Samples.IDLabel sıra.
ALTER SEQUENCE Samples.IDLabel
RESTART WITH 1 ;
Yeniden doğrulamak için select deyimi yürütme Samples.IDLabel sırasını yeniden 1 numaralı.
SELECT NEXT VALUE FOR Samples.IDLabel OVER (ORDER BY Name) AS NutID, ProductID, Name, ProductNumber FROM Production.Product
WHERE Name LIKE '%nut%' ;
G.Tablo kimlikten için sırasını değiştirme
Aşağıdaki örnek, bir şema ve örneğin üç satır içeren bir tablo oluşturur. Sonra örnek, yeni bir sütun ekler ve eski sütunu düşer.
-- Create a schema
CREATE SCHEMA Test ;
GO
-- Create a table
CREATE TABLE Test.Department
(
DepartmentID smallint IDENTITY(1,1) NOT NULL,
Name nvarchar(100) NOT NULL,
GroupName nvarchar(100) NOT NULL
CONSTRAINT PK_Department_DepartmentID PRIMARY KEY CLUSTERED
(DepartmentID ASC)
) ;
GO
-- Insert three rows into the table
INSERT Test.Department(Name, GroupName)
VALUES ('Engineering', 'Research and Development');
GO
INSERT Test.Department(Name, GroupName)
VALUES ('Tool Design', 'Research and Development');
GO
INSERT Test.Department(Name, GroupName)
VALUES ('Sales', 'Sales and Marketing');
GO
-- View the table that will be changed
SELECT * FROM Test.Department ;
GO
-- End of portion creating a sample table
--------------------------------------------------------
-- Add the new column that does not have the IDENTITY property
ALTER TABLE Test.Department
ADD DepartmentIDNew smallint NULL
GO
-- Copy values from the old column to the new column
UPDATE Test.Department
SET DepartmentIDNew = DepartmentID ;
GO
-- Drop the primary key constraint on the old column
ALTER TABLE Test.Department
DROP CONSTRAINT [PK_Department_DepartmentID];
-- Drop the old column
ALTER TABLE Test.Department
DROP COLUMN DepartmentID ;
GO
-- Rename the new column to the old columns name
EXEC sp_rename 'Test.Department.DepartmentIDNew',
'DepartmentID', 'COLUMN';
GO
-- Change the new column to NOT NULL
ALTER TABLE Test.Department
ALTER COLUMN DepartmentID smallint NOT NULL ;
-- Add the unique primary key constraint
ALTER TABLE Test.Department
ADD CONSTRAINT PK_Department_DepartmentID PRIMARY KEY CLUSTERED
(DepartmentID ASC) ;
-- Get the highest current value from the DepartmentID column
-- and create a sequence to use with the column. (Returns 3.)
SELECT MAX(DepartmentID) FROM Test.Department ;
-- Use the next desired value (4) as the START WITH VALUE;
CREATE SEQUENCE Test.DeptSeq
AS smallint
START WITH 4
INCREMENT BY 1 ;
GO
-- Add a default value for the DepartmentID column
ALTER TABLE Test.Department
ADD CONSTRAINT DefSequence DEFAULT (NEXT VALUE FOR Test.DeptSeq)
FOR DepartmentID;
GO
-- View the result
SELECT DepartmentID, Name, GroupName
FROM Test.Department ;
-- Test insert
INSERT Test.Department (Name, GroupName)
VALUES ('Audit', 'Quality Assurance') ;
GO
-- View the result
SELECT DepartmentID, Name, GroupName
FROM Test.Department ;
GO
Transact-SQLdeyimleri kullanan SELECT *Yeni sütunu ilk sütun yerine son sütun olarak alırsınız. Bu kabul edilebilir değilse, sonra tamamen yeni bir tablo oluşturabilir, verileri taşımak için ve gerekir yeni tablo izinleri yeniden.