Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Bu makalede SQL Server, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği'nde sıra numaralarının nasıl kullanılacağı açıklanmaktadır. Sıra, sıranın oluşturulduğu belirtime göre sayısal değerler dizisi oluşturan kullanıcı tanımlı şemaya bağlı bir nesnedir.
Genel bakış
Sayısal değerlerin sırası, tanımlı bir aralıkta artan veya azalan sırada oluşturulur ve istendiği gibi döngü (yineleme) olabilir. Diziler, kimlik sütunlarından farklı olarak tablolarla ilişkilendirilmemiştir. Uygulama bir sonraki değerini almak için bir dizi nesnesine başvurur. Diziler ve tablolar arasındaki ilişki uygulama tarafından denetlenir. Kullanıcı uygulamaları bir dizi nesnesine başvurabilir ve değer anahtarlarını birden çok satır ve tablo arasında koordine edebilir.
CREATE SEQUENCE deyimi kullanılarak tablolardan bağımsız olarak bir dizi oluşturulur. Seçenekler, performansı geliştirmek için artım, maksimum ve minimum değerleri, başlangıç noktasını, otomatik yeniden başlatma özelliğini ve önbelleğe almayı denetlemenizi sağlar. Seçenekler hakkında bilgi için bkz. CREATE SEQUENCE .
Satırlar eklendiğinde oluşturulan kimlik sütunu değerlerinin aksine, bir uygulama işlevi için NEXT VALUE çağrısı yaparak satırı eklemeden önce sonraki sıra numarasını alabilir. Sıra numarası, bir tabloya hiçbir zaman eklenmese bile, NEXT VALUE FOR ifadesi çağrıldığında tahsis edilir. NEXT VALUE FOR işlevi, tablo tanımındaki bir sütun için varsayılan değer olarak kullanılabilir. Aynı anda birden çok dizi numarası aralığı almak için sp_sequence_get_range kullanın.
Bir dizi herhangi bir tamsayı veri türü olarak tanımlanabilir. Veri türü belirtilmezse, bir dizi varsayılan olarak bigintolur.
Dizileri kullanma
Aşağıdaki senaryolarda kimlik sütunları yerine dizileri kullanın:
Tabloya ekleme yapılmadan önce uygulama bir sayı gerektirir.
Uygulama, birden çok tablo veya tablo içindeki birden çok sütun arasında tek bir sayı serisinin paylaşılması gerekir.
Belirtilen bir sayıya ulaşıldığında uygulamanın numara serisini yeniden başlatması gerekir. Örneğin, 1 ile 10 arasında değerler atandıktan sonra uygulama 1 ile 10 arasında değerleri yeniden atamaya başlar.
Uygulama, sıra değerlerini başka bir alana göre sıralamayı gerektirir. NEXT VALUE FOR işlevi, over yan tümcesini işlev çağrısına uygulayabilir. OVER yan tümcesi, döndürülen değerlerin OVER yan tümcesinin ORDER BY yan tümcesinin sırasına göre oluşturulmasını garanti eder.
Bir uygulamanın aynı anda birden çok numara atanması gerekir. Örneğin, bir uygulamanın beş sıralı sayı ayırması gerekir. Kimlik değerlerini istemek, diğer işlemlerin aynı anda sayı verilmesi durumunda seride boşluklara neden olabilir.
sp_sequence_get_range
'ı arayarak dizideki birkaç numarayı aynı anda alabilirsiniz.Dizinin özelliklerini, artış değeri gibi, değiştirmeniz gerekir.
Sınırlama
Değerleri değiştirilemeyen kimlik sütunlarından farklı olarak, sıra değerleri tabloya girdikten sonra otomatik olarak korunmaz. Sıra değerlerinin değiştirilmesini önlemek için, değişiklikleri geri almak için tablodaki bir güncelleştirme tetikleyicisini kullanın.
Sıra değerleri için benzersizlik otomatik olarak sağlanmaz. Sıra değerlerini yeniden kullanabilme özelliği tasarım gereğidir. Tablodaki sıra değerlerinin benzersiz olması gerekiyorsa, sütunda benzersiz bir kısıtlama oluşturun. Tablodaki sıra değerlerinin bir tablo grubu genelinde benzersiz olması gerekiyorsa, güncelleştirme deyimleri veya sıra numarası döngülerinden kaynaklanan yinelemeleri önlemek için tetikleyiciler oluşturun.
Sıra nesnesi, tanımına göre sayılar oluşturur, ancak sıra nesnesi sayıların nasıl kullanıldığını denetlemez. Bir tabloya eklenen sıra numaraları, işlem geri alındığında, tek bir sıra nesnesi birden fazla tablo tarafından paylaşıldığında veya sıra numaraları tablolarda kullanılmadan ayrıldığında boşluklu olabilir. ÖNBELLEK seçeneğiyle oluşturulduğunda, güç kesintisi gibi beklenmeyen bir kapatma, önbellekteki sıra numaralarının kaybolmasına neden olabilir.
tek bir Transact-SQL deyimi içinde aynı sıra oluşturucuyu belirten işlevi için NEXT VALUE birden çok örneği varsa, tüm bu örnekler bu Transact-SQL deyimi tarafından işlenen belirli bir satır için aynı değeri döndürür. Bu davranış ANSI standardıyla tutarlıdır.
Sıra numaraları geçerli işlemin kapsamı dışında oluşturulur. İşlemin sıra numarası kullanılarak tamamlanıp tamamlanmadığı veya geri alınıp alınmadığına bakılmaksızın tüketilirler. Yinelenen doğrulama yalnızca bir kayıt tam olarak dolduruldıktan sonra gerçekleşir. Bu, bazı durumlarda oluşturma sırasında birden fazla kayıt için aynı numaranın kullanılmasına neden olabilir, ancak daha sonra yinelenen olarak tanımlanır. Bu durum oluşursa ve diğer otomatik sayı değerleri sonraki kayıtlara uygulanmışsa, bu otomatik sayı değerleri arasında bir boşluk oluşmasına neden olabilir.
Tipik kullanım
-2.147.483.648'den 2.147.483.647'ye kadar 1 artan bir tamsayı sıra numarası oluşturmak için aşağıdaki deyimi kullanın.
CREATE SEQUENCE Schema.SequenceName
AS int
INCREMENT BY 1 ;
1'den başlayarak 1'e 1 ekleyen ve 2,147,483,647'e kadar artarak giden bir kimlik sütununa benzer bir tamsayı sıra numarası oluşturmak için aşağıdaki ifadeyi kullanın.
CREATE SEQUENCE Schema.SequenceName
AS int
START WITH 1
INCREMENT BY 1 ;
Dizileri yönetme
Diziler hakkında bilgi için, sys.sequencessorgusunu kullanın.
Örnekler
Makalelerde CREATE SEQUENCE, NEXT VALUE FORve sp_sequence_get_rangeek örnekler verilmiştir.
A. Tek bir tabloda sıra numarası kullanma
Aşağıdaki örnek Test adlı bir şema, Orders adlı bir tablo ve CountBy1 adlı bir dizi oluşturur ve sonra NEXT VALUE FOR işlevini kullanarak tabloya satır ekler.
CREATE SCHEMA Test;
GO
CREATE TABLE Test.Orders
(
OrderID INT PRIMARY KEY,
Name VARCHAR (20) NOT NULL,
Qty INT NOT NULL
);
GO
CREATE SEQUENCE Test.CountBy1
START WITH 1
INCREMENT BY 1;
GO
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
SELECT *
FROM Test.Orders;
GO
Sonuç kümesi aşağıdadır.
OrderID Name Qty
1 Tire 2
2 Seat 1
3 Brake 1
B. Satır eklemeden önce "NEXT VALUE FOR" ifadesinin çağrılması
Aşağıdaki örnek, A örneğinde oluşturulan Orders
tablosunu kullanarak @nextID
adlı bir değişken bildirir ve değişkeni bir sonraki kullanılabilir sıra numarasına ayarlamak için NEXT VALUE FOR işlevini kullanır. Uygulamanın, müşteriye olası siparişinin OrderID
numarasını sağlama ve ardından siparişi doğrulama gibi bazı işlemleri gerçekleştirdiği varsayılır. Bu işlem ne kadar sürerse sürsün veya işlem sırasında kaç sipariş daha eklenirse eklensin, özgün numara bu bağlantı tarafından kullanılmak üzere korunur. Son olarak, INSERT
deyimi sırayı Orders
tablosuna ekler.
DECLARE @NextID AS INT;
SET @NextID = NEXT VALUE FOR Test.CountBy1;
INSERT Test.Orders (OrderID, Name, Qty)
VALUES (@NextID, 'Rim', 2);
C. Birden çok tabloda sıra numarası kullanma
Bu örnekte, üretim hattı izleme işleminin atölye boyunca gerçekleşen olaylarla ilgili bildirim aldığı varsayılır. Her olay benzersiz ve monoton olarak artan EventID
bir sayı alır. Tüm olayları birleştiren raporların her olayı benzersiz olarak tanımlayabilmesi için tüm olaylar aynı EventID
sıra numarasını kullanır. Ancak olay verileri, olayın türüne bağlı olarak üç farklı tabloda depolanır. Kod örneği, Audit
adlı bir şema, EventCounter
adlı bir dizi ve her birinin varsayılan değer olarak EventCounter
dizisini kullanan üç tablo oluşturur. Ardından örnek, üç tabloya satır 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 DEFAULT ( NEXT VALUE FOR Audit.EventCounter) PRIMARY KEY CLUSTERED,
EventTime DATETIME DEFAULT (getdate()) NOT NULL,
EventCode NVARCHAR (5) NOT NULL,
Description NVARCHAR (300) NULL
);
GO
CREATE TABLE Audit.ErrorEvents
(
EventID INT DEFAULT ( NEXT VALUE FOR Audit.EventCounter) PRIMARY KEY CLUSTERED,
EventTime DATETIME DEFAULT (getdate()) NOT NULL,
EquipmentID INT NULL,
ErrorNumber INT NOT NULL,
EventDesc NVARCHAR (256) NULL
);
GO
CREATE TABLE Audit.StartStopEvents
(
EventID INT DEFAULT ( NEXT VALUE FOR Audit.EventCounter) PRIMARY KEY CLUSTERED,
EventTime DATETIME DEFAULT (getdate()) NOT NULL,
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 threshold 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.');
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;
Sonuç kümesi aşağıdadı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. Sonuç kümesinde yinelenen sıra numaraları oluşturma
Aşağıdaki örnekte sıra numaralarının iki özelliği gösterilmektedir: döngü yapma ve bir select deyiminde NEXT VALUE FOR
kullanma.
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. OVER yan tümcesini kullanarak sonuç kümesi için sıra numaraları oluşturma
Aşağıdaki örnek, dizi numarası sütununu eklemeden önce sonuç kümesini Name
göre sıralamak için OVER
yan tümcesini kullanır.
USE AdventureWorks2022;
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, Samples.IDLabel
sıra numaralarının ilk 79'unu tüketir. (AdventureWorks2022
sürümünüz farklı sayıda sonuç döndürebilir.) Sonraki 79 sıra numarasını (80 ile 158) kullanmak için aşağıdakileri çalıştırın.
SELECT NEXT VALUE FOR Samples.IDLabel OVER (ORDER BY Name) AS NutID,
ProductID,
Name,
ProductNumber
FROM Production.Product
WHERE Name LIKE '%nut%';
Samples.IDLabel
dizisini yeniden başlatmak için aşağıdaki komutu yürütün.
ALTER SEQUENCE Samples.IDLabel
RESTART WITH 1 ;
Samples.IDLabel
dizisinin 1 numarayla yeniden başlatıldığını doğrulamak için select deyimini yeniden yürütür.
SELECT NEXT VALUE FOR Samples.IDLabel OVER (ORDER BY Name) AS NutID,
ProductID,
Name,
ProductNumber
FROM Production.Product
WHERE Name LIKE '%nut%';
G. Bir tabloyu kimlikten diziye değiştirme
Aşağıdaki örnek, örnek için üç satır içeren bir şema ve tablo oluşturur. Ardından örnek yeni bir sütun ekler ve eski sütunu bırakır.
CREATE SCHEMA Test;
GO
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 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
SELECT *
FROM Test.Department;
GO
ALTER TABLE Test.Department
ADD DepartmentIDNew SMALLINT NULL;
GO
UPDATE Test.Department
SET DepartmentIDNew = DepartmentID;
GO
ALTER TABLE Test.Department DROP CONSTRAINT [PK_Department_DepartmentID];
ALTER TABLE Test.Department DROP COLUMN DepartmentID;
GO
EXECUTE sp_rename 'Test.Department.DepartmentIDNew', 'DepartmentID', 'COLUMN';
GO
ALTER TABLE Test.Department ALTER COLUMN DepartmentID SMALLINT NOT NULL;
ALTER TABLE Test.Department
ADD CONSTRAINT PK_Department_DepartmentID PRIMARY KEY CLUSTERED (DepartmentID ASC);
SELECT MAX(DepartmentID)
FROM Test.Department;
CREATE SEQUENCE Test.DeptSeq
AS SMALLINT
START WITH 4
INCREMENT BY 1;
GO
ALTER TABLE Test.Department
ADD CONSTRAINT DefSequence DEFAULT ( NEXT VALUE FOR Test.DeptSeq) FOR DepartmentID;
GO
SELECT DepartmentID,
Name,
GroupName
FROM Test.Department;
INSERT Test.Department (Name, GroupName)
VALUES ('Audit', 'Quality Assurance');
GO
SELECT DepartmentID,
Name,
GroupName
FROM Test.Department;
SELECT *
kullanan Transact-SQL deyimleri, yeni sütunu ilk sütun yerine son sütun olarak alır. Bu kabul edilebilir değilse, tamamen yeni bir tablo oluşturmanız, verileri bu tabloya taşımanız ve ardından yeni tabloda izinleri yeniden oluşturmanız gerekir.
İlgili içerik
- CREATE SEQUENCE (Transact-SQL)
- ALTER SEQUENCE (Transact-SQL)
- DROP SEQUENCE (Transact-SQL)
- TABLO OLUŞTUR (Transact-SQL) KİMLİK (Özellik)