Spis treści:

Kategoria:SQL Server


Różnica między sysobjects.xtype a sysobjects.type

Są w SQL Server takie obszary, których rzadko się dotyka. Są też takie miejsca, które są dość tajemnicze. Są w końcu takie, których używamy i nawet do końca nie wnikamy, czy używamy ich właściwie. Ważne w tym wszystkim jest to, że jakoś to wszystko działa. Obszarem, który przysparza problemy jest obecność dwóch, prawie identycznych kolumn w tabeli sysobjects. Są to kolumny type oraz xtype.

Przypomnę może dla niewtajemniczonych, że w tabeli sysobjects znajdują się rekordy opisujące każdy obiekt bazy danych, między innymi więzy integralności, wartości domyślne dla kolumn, klucze główne o obce, procedury składowane, wyzwalacze, widoki i inne.

Problemy nastręcza to, że w zdecydowanej większości przypadków wartości w tych kolumnach powtarzają się. Dokumentacja SQL Server też niewiele tutaj pomaga, bo każda z kolumn opisana jest w sposób następujący: Object type., czyli typ obiektu.

Nieścisłości i pewnego rodzaju nadmiarowość zostały pewnie dostrzeżone przez Microsoft, co doprowadziło do rozwiązania tego problemu w nowszych wersjach SQL Serverów. Obecnie jedynie słuszną tabelą pełniącą te same funkcje jest sys.objects.

Jaka jest zatem różnica?

Różnica jest subtelna i można ją dostrzec tylko w nielicznych przypadkach. Rzeczywiście obie kolumny zawierają typ obiektu. Co więcej, prawdą jest, że w zdecydowanej większości wartości w tych kolumnach zdefiniowane jako char(2) powtarzają się. Różnica pojawia się na dwóch polach. Są to:

  • więzy unikalności, czyli UNIQUE CONSTRAINT
  • klucz główny, czyli PRIMARY KEY

UNIQUE CONSTRAINT ma w kolumnie type wartość K, natomiast w kolumnie xtype wartość UQ. PRIMARY KEY ma w kolumnie type wartość K, natomiast w kolumnie xtype wartość PK. Jak widać kolumna xtype jest bardziej wyspecjalizowana.

Jak już zostało wcześniej wspomniane, obecnie należy używać tylko i wyłącznie tabeli sys.objects. Problem dwóch kolumn rozwiązuje się sam.

Kategoria:SQL Server

, 2013-12-20

Brak komentarzy - bądź pierwszy

Dodaj komentarz
Wyślij
Ostatnie komentarze
Dzieki za rozjasnienie zagadnienia upsert. wlasnie sie ucze programowania :).
Co się stanie gdy spróbuję wyszukać:
SELECT * FROM NV_Airport WHERE Code='SVO'
SELECT * FROM V_Airport WHERE Code=N'SVO'
(odwrotnie są te N-ki)
Będzie konwersja czy nie znajdzie żadnego rekordu?