sql >> Database >  >> RDS >> Sqlserver

Waarom (en hoe) kolommen splitsen met master..spt_values?

Doel

Waarom ongedocumenteerde master..spt-values gebruiken

Sybase, en dus zijn bastaardzoon MS SQL, bieden verschillende eigenschappen en functies voor het product, dat wordt geïmplementeerd in systeemprocedures (in tegenstelling tot de binaire bestanden zoals sqlserver, die als een service worden gestart). Deze procedures voor systeemprocedures zijn geschreven in SQL-code en hebben de naam sp_%. Afgezien van enkele geheime interne onderdelen, hebben ze dezelfde beperkingen en behoeften als elke andere SQL-code. Ze maken deel uit van het Sybase ASE- of SQL Server-product. Als zodanig zijn ze niet vereist om het te documenteren; en de interne bits kunnen redelijkerwijs niet als "ongedocumenteerd" worden bestempeld.

master..spt_values bevat alle verschillende stukjes en beetjes die de genoemde systeemprocedures nodig hebben, in een SQL-tabel, om de verschillende rapporten te produceren. De sp betekent systeemprocedure; spt betekent tabellen voor systeemprocedures; en natuurlijk values is de inhoud.

Opzoektabellen

Wat is de (betekenis van) Type ='P'

Mensen beschrijven vaak spt_values als "gedenormaliseerd", maar dat is de verkeerde term. De juiste term is gevouwen , of verpakt . Het zijn ongeveer 26 logische opzoektabellen, elk prachtig genormaliseerd, gevouwen tot één fysieke tabel, met een Type kolom om de logische tabellen te onderscheiden.

In een normale database zou dat een grove fout zijn (kijk maar naar de antwoorden voor "één opzoektabel of veel"). Maar in een servercatalogus is het wenselijk, het vervangt 26 fysieke tabellen.

  • "L" staat voor LockType Lookup; "V" staat voor DeviceType Lookup (V is een afkorting voor Device in de hele server); enz. Type "P2" bevat bitsgewijze rangtelwoorden, voor de uitbreiding van bits die zijn verpakt in een INT.

  • Een reeks opeenvolgende getallen binnen bekende grenzen, die beschikbaar is in de vorm van een SQL-tabel, is vereist om een ​​projectie uit te voeren, wat veel van de systeemprocedures moeten doen. Typ "P" is een lijst met opeenvolgende nummers tussen 0 en 2047.

  • De term Projectie wordt hier gebruikt als de technisch nauwkeurige betekenis, de natuurlijke logische betekenis, niet de relationele algebrabetekenis, die onnatuurlijk is.

Er is daarom maar één doel voor spt_values, om 26 gevouwen, anders gescheiden, referentietabellen en één projectietafel te bevatten.

Uitbreiding

Het gewone gebruik van spt_values dan, is als een gewone opzoek- of referentie of ENUM tafel. Eerst de opzoekwaarden:

    SELECT *                    -- list Genders
        FROM Gender 

Het wordt op dezelfde manier gebruikt als Persoon een geslachtscode heeft die moet worden uitgebreid (zeer uitgebreid, deze gekke dagen):

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

bijv. sp_lock produceert een rapport van actieve vergrendelingen, waarbij vergrendelingstypes worden weergegeven als string namen . Maar master..syslocks bevat slottypes als nummers , het bevat niet die namen; en als dat zo was, zou het een sterk gedenormaliseerde tafel zijn! Als u de query uitvoert (Sybase ASE-code, moet u converteren):

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

u zult 66 LockType nummers opmerken en namen in de opzoektabel. Dat maakt sp_lock . mogelijk om eenvoudige code uit te voeren, zoals Person::Gender above:

    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

Projectie

Wat is de (betekenis van) Type ='P' ?

Wat is projectie en hoe wordt het gebruikt?

Stel bijvoorbeeld dat u in plaats van de actieve vergrendelingen die door de bovenstaande zoekopdracht zijn geproduceerd, een lijst met alle wilt hebben 66 LockTypes, met het aantal actieve sloten (of Null). Je hebt geen cursor nodig, of een WHILE lus. We zouden kunnen projecteren de LockType Lookup-tabel, via het aantal actieve sloten:

    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"

Er zijn meerdere methoden, dat is er maar één. Een andere methode is om een ​​afgeleide tabel te gebruiken in plaats van de subquery. Maar je hebt nog steeds de projectie nodig.

Dat is typisch wat spt_values wordt gebruikt voor Uitbreiding of Projectie. Nu je weet dat het er is, kun je het ook gebruiken. Het is veilig (in de master database) en wordt gebruikt door vrijwel alle systeemprocedures, wat betekent dat de systeemprocedures niet zonder kunnen.

voor het splitsen van een kolom?

Ah, je begrijpt de code "Een CSV-kolom splitsen in meerdere rijen" niet.

  • Vergeet spt_values voor een moment, en onderzoek die code opnieuw. Het heeft alleen een lijst met opeenvolgende nummers nodig, zodat u byte voor byte door de lijst met waarden in de CSV-kolom kunt stappen. De code wordt alleen geactiveerd voor elke byte die een komma of een einde-van-tekenreeks is.

  • Waar vind je een reeks opeenvolgende nummers in de vorm van een SQL-tabel, in plaats van er een helemaal opnieuw te maken en erin te INSERTEREN? Waarom, master..spt_values natuurlijk. Als je weet dat het er is.

  • (U kunt iets leren over de interne onderdelen van ASE of SQL Server, gewoon door de code van de door het systeem opgeslagen procedures te lezen.)

  • Merk op dat elk CSV-veld in één kolom een ​​grove normalisatiefout is, het breekt 2NF (bevat herhalende waarden) en 1NF (niet atomair). Let op, dat is niet verpakt of gevouwen, het is een herhalende groep, het is niet-genormaliseerd. Een van de vele negatieve gevolgen van zo'n grove fout is dat in plaats van eenvoudige SQL te gebruiken om als rijen door de herhalende groep te navigeren, men complexe code moet gebruiken om de inhoud van het niet-genormaliseerde CSV-veld te bepalen en te extraheren. Hier spt_values P biedt een vector voor die complexe code, waardoor het gemakkelijker wordt.

Wat is het voordeel ervan?

Ik denk dat ik daar antwoord op heb gegeven. Als je het niet had, zou elke systeemprocedure die een lijst met nummers vereist, een tijdelijke tabel moeten MAKEN; en INSERT de rijen erin; voordat de code wordt uitgevoerd. Als u die stappen niet hoeft uit te voeren, worden de systeemprocedures natuurlijk veel sneller.

Wanneer u nu een projectie moet uitvoeren, bijv. kalenderdatums in de toekomst, of wat dan ook, u kunt spt_values . gebruiken , in plaats van elke keer uw eigen tijdelijke tabel te moeten maken (of uw eigen persoonlijke vaste tafel te maken en te onderhouden).



  1. Microsoft T-SQL naar Oracle SQL vertaling

  2. Hoe stel je een standaardwaarde in voor een MySQL Datetime-kolom?

  3. PostgreSQL:hoofdletterongevoelige tekenreeksvergelijking

  4. SQL Server-zelfstudie - Alles wat u nodig hebt om Transact-SQL onder de knie te krijgen