sql >> Databáze >  >> RDS >> Sqlserver

Proč (a jak) rozdělit sloupec pomocí master..spt_values?

Účel

Proč používat nezdokumentované master..spt-values

Sybase, potažmo jeho parchantský syn MS SQL, poskytují různé vlastnosti a funkce pro produkt, který je implementován v systémových procedurách (na rozdíl od binárních souborů typu sqlserver, které se spouštějí jako služba). Tyto procedury systémových procedur jsou napsány v kódu SQL a pojmenovány sp_%. Kromě některých tajných vnitřních prvků mají stejná omezení a potřeby jako jakýkoli jiný kód SQL. Jsou součástí produktu Sybase ASE nebo SQL Server. Jako takové nejsou vyžadovány zdokumentovat to; a vnitřní bity nelze rozumně označit jako „nedokumentované“.

master..spt_values obsahuje všechny různé části, které uvedené systémové procedury potřebují, v tabulce SQL, aby vytvořily různé zprávy. sp znamená systémový postup; spt znamená tabulky pro systémové procedury; a samozřejmě values je obsah.

Vyhledávací tabulky

Co je (význam) Type ='P'

Lidé často popisují spt_values, jako "den-normalizované", ale to je nesprávný termín. Správný výraz je složený nebo zabalené . Je to asi 26 logických vyhledávacích tabulek, každá krásně normalizovaná, složená do jedné fyzické tabulky s Type k rozlišení logických tabulek.

Nyní v normální databázi by to byla hrubá chyba (stačí se podívat na odpovědi pro "jedna vyhledávací tabulka nebo mnoho"). Ale v katalogu serverů je to žádoucí, nahrazuje 26 fyzických tabulek.

  • "L" znamená LockType Lookup; „V“ znamená vyhledávání typu zařízení (V je zkratka pro zařízení na serveru); atd. Typ "P2" obsahuje bitové ordinály pro rozšíření bitů, které jsou zabaleny do INT.

  • Sada po sobě jdoucích čísel ve známých mezích, která je k dispozici ve formě tabulky SQL, je vyžadována k provedení projekce, kterou musí dělat mnoho systémových procedur. Typ "P" je seznam po sobě jdoucích čísel mezi 0 a 2047.

  • Termín Projekce se zde používá jako technicky přesný význam, přirozený logický význam, nikoli význam relační algebry, což je nepřirozené.

spt_values, má tedy pouze jeden účel obsahovat 26 složených, jinak samostatných, referenčních tabulek a jednu projekční tabulku.

Rozšíření

Běžné použití spt_values, pak je jako obyčejné vyhledávání nebo reference nebo ENUM stůl. Nejprve hodnoty vyhledávání:

    SELECT *                    -- list Genders
        FROM Gender 

Používá se stejným způsobem jako Osoba má GenderCode, který je třeba rozšířit (velmi rozšířený, v těchto podivných dnech):

    SELECT  P.*,                -- list Person
            G.Name              -- expand GenderCode to Name
        FROM Person P
        JOIN Gender G
            ON P.GenderCode = G.GenderCode

Např. sp_lock vytvoří sestavu aktivních zámků, zobrazující typy zámků jako řetězce názvů . Ale master..syslocks obsahuje typy zámků jako čísla , neobsahuje tato jména; a pokud ano, byla by to špatně denormalizovaná tabulka! Pokud provedete dotaz (kód Sybase ASE, budete muset převést):

    SELECT *                    -- list LockTypes
        FROM master..spt_values 
        WHERE type = "L"

všimnete si 66 číslic LockType a jména ve vyhledávací tabulce. To umožňuje sp_lock ke spuštění jednoduchého kódu jako Person::Gender výše:

    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

Projekce

Co je (význam) Type ='P'?

Co je projekce a jak se používá?

Řekněme například, že namísto aktivních zámků vytvořených dotazem výše jste chtěli seznam všech 66 LockTypes, zobrazující počet aktivních zámků (nebo Null). Nepotřebujete kurzor ani WHILE smyčka. Mohli bychom Projektovat vyhledávací tabulku LockType přes počet aktivních zámků:

    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"

Existuje několik metod, to je jen jedna. Další metodou je použití odvozené tabulky namísto poddotazu. Ale stále potřebujete Projekci.

To je obvykle to, co spt_values, se používá buď pro expanzi nebo projekci. Nyní, když víte, že tam je, můžete to také použít. Je to bezpečné (v master databáze) a používají jej prakticky všechny systémové procedury, což znamená, že systémové procedury bez něj nemohou běžet.

pro rozdělení sloupce?

Aha, nerozumíte kódu "Rozdělit jeden sloupec CSV do více řádků".

  • Zapomeňte na spt_values, na chvíli a znovu prozkoumejte tento kód. Potřebuje pouze seznam po sobě jdoucích čísel, aby bylo možné procházet seznamem hodnot ve sloupci CSV, bajt po bajtu. Kód se aktivuje pouze pro každý bajt, který je čárkou nebo koncem řetězce.

  • Kde získat sadu po sobě jdoucích čísel ve formě tabulky SQL, než je vytvářet od začátku a vkládat do ní? Proč, master..spt_values samozřejmě. Pokud víte, že tam je.

  • (Můžete se dozvědět něco o vnitřních částech ASE nebo SQL Serveru pouhým přečtením kódu systémových uložených procedur.)

  • Všimněte si, že jakékoli pole CSV v jednom sloupci je hrubou normalizační chybou, poruší 2NF (obsahuje opakující se hodnoty) a 1NF (ne atomární). Všimněte si, že to není zabalené nebo složené, jedná se o opakující se skupinu, je nenormalizované. Jedním z mnoha negativních důsledků takové hrubé chyby je, že namísto použití jednoduchého SQL k navigaci v opakující se skupině jako řádcích je nutné použít složitý kód k určení a extrahování obsahu nenormalizovaného pole CSV. Zde spt_values P poskytuje vektor pro tento složitý kód a usnadňuje jej.

Jaká je výhoda?

Myslím, že jsem na to odpověděl. Pokud byste ji neměli, každá systémová procedura, která vyžaduje seznam čísel, by musela VYTVOŘIT dočasnou tabulku; a VLOŽTE do něj řádky; před spuštěním jeho kódu. Samozřejmě, že nemusíte tyto kroky provádět, jsou systémové procedury mnohem rychlejší.

Nyní, když potřebujete provést projekci, např. kalendářní data v budoucnosti nebo cokoliv jiného, ​​můžete použít spt_values, , místo toho, abyste museli pokaždé vytvářet vlastní dočasnou tabulku (nebo si vytvořit vlastní soukromou trvalou tabulku a udržovat ji).



  1. Schéma SQL serveru a výchozí schéma

  2. Jak předám hodnotu parametru uložené procedury v komponentě Zdroj OLE DB?

  3. Když DISTINCT <> GROUP BY

  4. Připojte SQL Server k SugarCRM