Veritabanını sorgulayarak keşfetmek
SQL Server meta veriyi (tablolar, sütunlar, indeksler) sorgulanabilir görünümlerde tutar. Standart INFORMATION_SCHEMA görünümleri diğer SQL türlerinde da vardır; sys.* görünümleri SQL Server'a özgüdür ve daha ayrıntılıdır.
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, IS_NULLABLE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'orders' ORDER BY ORDINAL_POSITION;
SELECT name, object_id, type_desc FROM sys.tables ORDER BY name; EXEC sp_help 'products';
IDENTITY ile otomatik numara
CREATE TABLE notes (
note_id INT IDENTITY(1, 1) PRIMARY KEY,
body NVARCHAR(200) NOT NULL
);
INSERT INTO notes (body) VALUES (N'İlk not');
INSERT INTO notes (body) VALUES (N'İkinci not');
SELECT SCOPE_IDENTITY() AS son_eklenen_id;
SELECT * FROM notes;
| Fonksiyon | Ne döner? |
|---|---|
SCOPE_IDENTITY() | Aynı kapsamda son eklenen IDENTITY (önerilen) |
@@IDENTITY | Oturumdaki son IDENTITY (trigger'ların ürettiği dahil; dikkat!) |
@@ROWCOUNT | Son ifadenin etkilediği satır sayısı |
OBJECT_ID('ad') | Nesne yoksa NULL: IF OBJECT_ID('dbo.t') IS NOT NULL ... |
UPDATE products SET stock = stock + 10 WHERE category = N'Kitap'; SELECT @@ROWCOUNT AS guncellenen;
Derinleş: katalog görünümleriyle veritabanını keşfetmek
Yeni bir projeye katıldığında ilk iş, veritabanında ne olduğunu belgeye değil kataloga sormaktır; belge eskiyebilir, katalog her zaman günceldir. SQL Server'da iki katman vardır:
| Katman | Örnek | Ne zaman? |
|---|---|---|
INFORMATION_SCHEMA | TABLES, COLUMNS | Standart, diğer SQL türlerine taşınabilir sorgular |
sys.* katalog görünümleri | sys.tables, sys.columns, sys.indexes | SQL Server'a özgü ayrıntılar (indeks, IDENTITY, bağımlılık) |
sys görünümleri object_id ile birbirine bağlanır. Lezzet Kurye tablolarının sütun sayıları:
SELECT t.name AS tablo, COUNT(*) AS sutun FROM sys.tables t JOIN sys.columns c ON c.object_id = t.object_id WHERE t.name LIKE 'lk%' GROUP BY t.name ORDER BY t.name;
IDENTITY'nin incelikleri
- Boşluklar normaldir: Geri alınan bir INSERT veya sunucu yeniden başlaması kimlik değerlerini tüketir; IDENTITY ardışık numara garantisi vermez. Fatura numarası gibi boşluksuz seri gerekiyorsa ayrı bir mekanizma kur.
- Hangi fonksiyon?
SCOPE_IDENTITY()aynı kapsamdaki son değeri verir;@@IDENTITYtrigger'ın başka tabloya eklediği değeri döndürebilir;IDENT_CURRENT('tablo')başka oturumların eklemelerini de görür. - Çok satırlı eklemede: Tek bir son değer yetmez;
OUTPUT inserted.*eklenen her satırın kimliğini döndürür.
IF OBJECT_ID('dbo.notlar') IS NOT NULL DROP TABLE dbo.notlar;
CREATE TABLE notlar (
not_id INT IDENTITY(1, 1) PRIMARY KEY,
metin NVARCHAR(100) NOT NULL
);
INSERT INTO notlar (metin)
OUTPUT inserted.not_id, inserted.metin
VALUES (N'Kurye geç kaldı'), (N'Paket eksik geldi');
IF OBJECT_ID('dbo.t') IS NOT NULL DROP TABLE dbo.t; kalıbı eski sürümlerde de çalışır. SQL Server 2016+ için kısa yol DROP TABLE IF EXISTS dbo.t;.Sık hata: INFORMATION_SCHEMA sorgularında şemayı unutmak. Aynı adlı tablo farklı şemalarda (dbo.orders, arsiv.orders) bulunabilir; filtreye TABLE_SCHEMA = 'dbo' ekle. sys.tables ile çalışırken de SCHEMA_NAME(t.schema_id) ile şema adını göster.
Keşif kontrol listesi: Tablolar ve satır sayıları, her tablonun birincil anahtarı, yabancı anahtar ilişkileri, NULL'a izin veren sütunlar, tarih sütunlarının tipi (metin mi tarih mi), IDENTITY sütunları.