Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Mengapa (dan bagaimana) membagi kolom menggunakan master..spt_values?

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).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kecualikan kolom menggunakan SELECT * [kecuali kolomA] FROM tableA?

  2. Bagaimana menemukan gaji maksimum ketiga atau n dari tabel gaji?

  3. Cara Mendapatkan OBJECT_NAME() dari Database Berbeda di SQL Server

  4. SQL Server:konversi ((int)tahun,(int)bulan,(int)hari) ke Datetime

  5. Gunakan SCOPE_IDENTITY() untuk Mengembalikan Nilai Identitas yang Disisipkan Terakhir dalam Lingkup yang Sama (SQL Server)