Formål
Hvorfor bruge udokumenterede master..spt-values
Sybase, og derfor dens bastard-søn MS SQL, leverer forskellige funktioner og funktioner til produktet, som er implementeret i systemprocedurer (i modsætning til binære filer som sqlserver, der startes som en service). Disse systemprocedurer er skrevet i SQL-kode og hedder sp_%.
Bortset fra nogle hemmelige interne funktioner, har de de samme begrænsninger og behov som enhver anden SQL-kode. De er en del af Sybase ASE- eller SQL Server-produktet. Som sådan er de ikke påkrævede at dokumentere det; og de interne bits kan ikke med rimelighed mærkes som "udokumenterede".
master..spt_values
indeholder alle de forskellige bits og stykker, som de nævnte systemprocedurer har brug for, i en SQL-tabel, for at producere de forskellige rapporter. sp
betyder systemprocedure; spt
betyder tabeller til systemprocedurer; og selvfølgelig values
er indholdet.
Opslagstabeller
Hvad er (betydningen af) Type ='P'
Folk beskriver ofte spt_values
som "de-normaliseret", men det er det forkerte udtryk. Det korrekte udtryk er foldet , eller pakket . Det er 26 eller deromkring logiske opslagstabeller, hver smukt normaliseret, foldet til én fysisk tabel med en Type
kolonne for at differentiere de logiske tabeller.
Nu i en normal database ville det være en grov fejl (se bare svarene for "én opslagstabel eller mange"). Men i et serverkatalog er det ønskeligt, det erstatter 26 fysiske tabeller.
-
"L" står for LockType Lookup; "V" står for DeviceType Lookup (V er en forkortelse for Device overalt på serveren); osv. Type "P2" indeholder bitvise ordinaler til udvidelse af bits, der er pakket ind i en INT.
-
Et sæt af fortløbende tal inden for kendte grænser, der er tilgængelige i form af en SQL-tabel, er påkrævet for at udføre en projektion, hvilket mange af systemprocedurerne skal udføre. Type "P" er en liste over fortløbende tal mellem 0 og 2047.
-
Udtrykket Projektion bruges her som den teknisk præcise betydning, den naturlige logiske betydning, ikke den relationelle algebra-betydning, som er unaturlig.
Der er derfor kun ét formål med spt_values,
skal indeholde 26 foldede, ellers separate, referencetabeller og et projektionsbord.
Udvidelse
Den almindelige brug af spt_values
så er det som et almindeligt opslag eller reference eller ENUM
bord. Først opslagsværdierne:
SELECT * -- list Genders
FROM Gender
Det bruges på samme måde, som Person har en kønskode, der skal udvides (meget udvidet, disse freaky dage):
SELECT P.*, -- list Person
G.Name -- expand GenderCode to Name
FROM Person P
JOIN Gender G
ON P.GenderCode = G.GenderCode
For eksempel. sp_lock
producerer en rapport over aktive låse, der viser låsetyper som streng navne . Men master..syslocks
indeholder låsetyper som numre , den indeholder ikke disse navne; og hvis det gjorde det, ville det være et dårligt denormaliseret bord! Hvis du udfører forespørgslen (Sybase ASE-kode, skal du konvertere):
SELECT * -- list LockTypes
FROM master..spt_values
WHERE type = "L"
du vil bemærke 66 LockType numre og navne i opslagstabellen. Det tillader sp_lock
at udføre simpel kode som Person::Køn ovenfor:
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
Projektion
Hvad er (betydningen af) Type ='P'?
Hvad er projektion, og hvordan bruges det?
Lad os f.eks. sige, at du i stedet for de aktive låse produceret af forespørgslen ovenfor ville have en liste over alle 66 LockTypes, der viser antallet af aktive låse (eller Null). Du behøver ikke en markør eller en WHILE
sløjfe. Vi kunne projektere LockType Lookup-tabellen, gennem antallet af aktive låse:
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"
Der er flere metoder, det er kun én. En anden metode er at bruge en afledt tabel i stedet for underforespørgslen. Men du har stadig brug for projektionen.
Det er typisk hvad spt_values
bruges til enten udvidelse eller projektion. Nu hvor du ved, at den er der, kan du også bruge den. Det er sikkert (i master
). database) og bruges af stort set alle systemprocedurer, hvilket betyder, at systemprocedurerne ikke kan køre uden.
for at opdele en kolonne?
Ah, du forstår ikke koden "Opdel en CSV-kolonne i flere rækker".
-
Glem alt om
spt_values
et øjeblik, og undersøg koden igen. Den har bare brug for en liste over fortløbende tal, så den kan gå gennem listen over værdier i CSV-kolonnen, byte for byte. Koden aktiveres kun for hver byte, der er et komma eller enden af strengen. -
Hvor får man et sæt fortløbende tal i form af en SQL-tabel, i stedet for at OPRETTE en fra bunden og INDSÆTTE i den? Hvorfor,
master..spt_values
selvfølgelig. Hvis du ved, at den er der. -
(Du kan lære lidt om det interne i ASE eller SQL Server, blot ved at læse koden for de systemlagrede procedurer.)
-
Bemærk, at ethvert CSV-felt i én kolonne er en grov normaliseringsfejl, det bryder 2NF (indeholder gentagne værdier) og 1NF (ikke atomare). Bemærk, det er ikke pakket eller foldet, det er en gentagende gruppe, det er unormaliseret. En af de mange negative konsekvenser af en sådan grov fejl er, i stedet for at bruge simpel SQL til at navigere i den gentagende gruppe som rækker, skal man bruge kompleks kode til at bestemme og udtrække indholdet af det ikke-normaliserede CSV-felt. Her
spt_values P
giver en vektor for den komplekse kode, hvilket gør det nemmere.
Hvad er fordelen ved det?
Det tror jeg, jeg har svaret på. Hvis du ikke havde det, ville hver systemprocedure, der kræver en liste med tal, skulle OPRET en midlertidig tabel; og INDSÆT rækkerne i den; før du kører dens kode. Det gør naturligvis systemprocedurerne meget hurtigere, hvis du ikke behøver at udføre disse trin.
Når du nu skal udføre en projektion, f.eks. kalenderdatoer i fremtiden, eller hvad som helst, du kan bruge spt_values
, i stedet for at skulle oprette din egen midlertidige tabel hver gang (eller oprette din egen private permanente tabel og vedligeholde den).