Ana içeriğe geç
Kesit SQL
Orta · T-SQL (SQL Server)

Sistem görünümleri, IDENTITY ve yardımcı prosedürler

INFORMATION_SCHEMA, sys.tables, sp_help, IDENTITY, SCOPE_IDENTITY ve @@ROWCOUNT.

Uygulamada aç, 5 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

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;
FonksiyonNe döner?
SCOPE_IDENTITY()Aynı kapsamda son eklenen IDENTITY (önerilen)
@@IDENTITYOturumdaki son IDENTITY (trigger'ların ürettiği dahil; dikkat!)
@@ROWCOUNTSon 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ÖrnekNe zaman?
INFORMATION_SCHEMATABLES, COLUMNSStandart, diğer SQL türlerine taşınabilir sorgular
sys.* katalog görünümlerisys.tables, sys.columns, sys.indexesSQL 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

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');
OBJECT_ID ile korumaIF 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ı.

Alıştırmalara geç (5)