Tujuan
Mengapa menggunakan master..spt-values
yang tidak berdokumen
Sybase, dan karena itu anak haramnya MS SQL, menyediakan berbagai fitur dan fungsi untuk produk, yang diimplementasikan dalam prosedur sistem (berlawanan dengan binari seperti sqlserver, yang dimulai sebagai layanan). Prosedur prosedur sistem ini ditulis dalam kode SQL dan diberi nama sp_%.
Kecuali untuk beberapa internal rahasia, mereka memiliki batasan dan kebutuhan yang sama seperti kode SQL lainnya. Mereka adalah bagian dari produk Sybase ASE atau SQL Server. Dengan demikian, mereka tidak diperlukan untuk mendokumentasikannya; dan bit internal tidak dapat diberi label sebagai "tidak berdokumen".
master..spt_values
berisi semua berbagai bit dan potongan yang dibutuhkan oleh prosedur sistem tersebut, dalam tabel SQL, untuk menghasilkan berbagai laporan. sp
berarti prosedur sistem; spt
berarti tabel untuk prosedur sistem; dan tentu saja values
adalah isinya.
Tabel Pencarian
Apa (artinya) Type ='P'
Orang sering mendeskripsikan spt_values
sebagai "de-normalisasi", tapi itu adalah istilah yang salah. Istilah yang benar adalah dilipat , atau dikemas . Ini adalah 26 atau lebih tabel Pencarian logis, masing-masing dinormalisasi dengan indah, dilipat menjadi satu tabel fisik, dengan Type
kolom untuk membedakan tabel logika.
Sekarang dalam database normal, itu akan menjadi kesalahan besar (lihat saja jawaban untuk "satu tabel pencarian atau banyak"). Tetapi dalam katalog server, diinginkan, menggantikan 26 tabel fisik.
-
"L" adalah singkatan dari LockType Lookup; "V" adalah singkatan dari DeviceType Lookup (V adalah kependekan dari Device di seluruh server); dll. Ketik "P2" berisi ordinal bitwise, untuk perluasan bit yang dikemas ke dalam INT.
-
Satu set angka berurutan dalam batas yang diketahui, yang tersedia dalam bentuk tabel SQL diperlukan, untuk melakukan Proyeksi, yang harus dilakukan oleh banyak prosedur sistem. Ketik "P" adalah daftar angka berurutan antara 0 dan 2047.
-
Istilah Proyeksi digunakan di sini sebagai makna yang tepat secara teknis, makna logis alami, bukan makna aljabar relasional, yang tidak alami.
Oleh karena itu hanya ada satu tujuan untuk spt_values,
berisi 26 tabel Referensi terlipat, jika tidak terpisah, dan satu tabel Proyeksi.
Ekspansi
Penggunaan biasa spt_values
kemudian, adalah sebagai Pencarian atau Referensi biasa atau ENUM
meja. Pertama, nilai Pencarian:
SELECT * -- list Genders
FROM Gender
Ini digunakan dengan cara yang sama seperti Person memiliki GenderCode yang perlu diperluas (sangat diperluas, hari-hari aneh ini):
SELECT P.*, -- list Person
G.Name -- expand GenderCode to Name
FROM Person P
JOIN Gender G
ON P.GenderCode = G.GenderCode
Misalnya. sp_lock
menghasilkan laporan kunci aktif, menampilkan jenis kunci sebagai string nama . Tapi master..syslocks
berisi jenis kunci sebagai angka , itu tidak mengandung nama itu; dan jika ya, itu akan menjadi tabel yang didenormalisasi dengan buruk! Jika Anda menjalankan kueri (kode Sybase ASE, Anda harus mengonversi):
SELECT * -- list LockTypes
FROM master..spt_values
WHERE type = "L"
Anda akan melihat 66 LockType angka dan nama di tabel pencarian. Itu memungkinkan sp_lock
untuk mengeksekusi kode sederhana seperti Person::Gender di atas:
SELECT spid, -- list Active Locks
DB_NAME(dbid),
OBJECT_NAME(id, dbid),
v.name, -- expand lock name
page,
row
FROM master..syslocks L,
master..spt_values LT
WHERE L.type = LT.number --
AND type = "L" -- LockType Lookup table
ORDER by 1, 2, 3, 4, 5, 6 -- such that perusal is easy
Proyeksi
Apa (arti) Type ='P' ?
Apa itu Proyeksi dan bagaimana menggunakannya?
Katakanlah, misalnya, alih-alih kunci aktif yang dihasilkan oleh kueri di atas, Anda menginginkan daftar semua 66 LockTypes, menunjukkan jumlah kunci aktif (atau Null). Anda tidak memerlukan kursor, atau WHILE
lingkaran. Kita bisa Proyek tabel Pencarian LockType, sampai jumlah kunci aktif:
SELECT LT.name, -- list LockTypes
[Count] = ( -- with count
SELECT COUNT(*)
FROM master..syslocks
WHERE type = LT.number
)
FROM master..spt_values LT
WHERE type = "L"
Ada beberapa metode, itu hanya satu. Metode lain adalah dengan menggunakan Tabel Turunan alih-alih Subquery. Tapi Anda masih membutuhkan Proyeksi.
Itu biasanya spt_values
digunakan untuk, baik Ekspansi atau Proyeksi. Sekarang Anda tahu itu ada di sana, Anda juga bisa menggunakannya. Aman (di master
database) dan digunakan oleh hampir semua prosedur sistem, yang berarti prosedur sistem tidak dapat berjalan tanpanya.
untuk memisahkan kolom?
Ah, Anda tidak mengerti kode "Pisahkan satu kolom CSV menjadi beberapa baris".
-
Lupakan
spt_values
sejenak, dan periksa kode itu lagi. Itu hanya membutuhkan daftar angka berurutan, sehingga dapat menelusuri daftar nilai di kolom CSV, byte demi byte. Kode diaktifkan hanya untuk setiap byte yang berupa koma, atau akhir string. -
Di mana mendapatkan satu set angka berurutan dalam bentuk tabel SQL, daripada MENCIPTAKAN satu dari awal dan MEMASUKKAN ke dalamnya? Mengapa,
master..spt_values
tentu saja. Jika Anda tahu itu ada di sana. -
(Anda dapat mempelajari sedikit tentang internal ASE atau SQL Server, hanya dengan membaca kode prosedur tersimpan sistem.)
-
Perhatikan bahwa setiap bidang CSV dalam satu kolom adalah kesalahan Normalisasi kotor, itu memecah 2NF (berisi nilai berulang) dan 1NF (bukan atom). Catatan, yang tidak dikemas atau dilipat, itu adalah grup yang berulang, tidak dinormalisasi. Salah satu dari banyak konsekuensi negatif dari kesalahan besar seperti itu adalah, alih-alih menggunakan SQL sederhana untuk menavigasi grup berulang sebagai baris, kita harus menggunakan kode kompleks untuk menentukan dan mengekstrak konten bidang CSV yang tidak dinormalisasi. Di sini
spt_values P
menyediakan vektor untuk kode kompleks itu, membuatnya lebih mudah.
Apa manfaatnya?
Saya rasa saya sudah menjawabnya. Jika Anda tidak memilikinya, setiap prosedur sistem yang memerlukan daftar Angka harus MENCIPTAKAN tabel sementara; dan INSERT baris ke dalamnya; sebelum menjalankan kodenya. Tentu saja, tidak harus melakukan langkah-langkah tersebut, membuat prosedur sistem menjadi lebih cepat.
Sekarang, ketika Anda perlu melakukan Proyeksi, mis. tanggal kalender di masa depan, atau apa pun, Anda dapat menggunakan spt_values
, daripada harus membuat tabel temp Anda sendiri setiap kali (atau buat tabel permanen pribadi Anda sendiri dan pertahankan).