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