Podsumowanie

Aparat bazy danych w programie Microsoft SQL Server 2016 i bazie danych Azure SQL Database zawierają usprawnienia konwersji typów danych oraz kilka innych operacji. Większość tych ulepszeń zapewnia większą precyzję podczas współpracy z typami zmiennoprzecinkowymi, a także z klasycznymi typami DateTime.

Te udoskonalenia są dostępne w przypadku korzystania z poziomu zgodności bazy danych o szybkości co najmniej 130. Oznacza to, że w przypadku niektórych (najczęściej spotykanych) wyrażeń zostaną wyświetlone różne wyniki dla określonych wartości wejściowych po uaktualnieniu bazy danych do poziomu zgodności 130 lub wyższego. Wyniki te mogą być odzwierciedlone w utrwalonych strukturach bazy danych, w tym dane tabeli, które podlegają ograniczeniom check , utrwalone kolumny obliczane, indeksy odwołujące się do kolumn obliczanych, indeksów filtrowanych i widoków indeksowanych.

Jeśli masz bazę danych utworzoną we wcześniejszej wersji programu SQL Server, zalecamy dodatkowe sprawdzenie poprawności po uaktualnieniu do programu SQL Server 2016 lub nowszego i przed zmianą poziomu zgodności bazy danych. Jeśli okaże się, że zmiany mają wpływ na wszystkie utrwalone struktury bazy danych, zalecamy odbudowanie odpowiednich struktur po uaktualnieniu poziomu zgodności bazy danych. Dzięki temu będziesz mieć możliwość skorzystania z tych ulepszeń w programie SQL Server 2016 lub nowszym.

W tym artykule opisano, jak można sprawdzić poprawność utrwalonych struktur w bazie danych w ramach uaktualnienia do poziomu zgodności 130 lub wyższego, a także jak można odbudować struktury, których dotyczą luki po zmianie poziomu zgodności.

Etapy sprawdzania poprawności podczas uaktualniania poziomu zgodności bazy danych

Począwszy od programu SQL Server 2016, zarówno program SQL Server, jak i baza danych SQL Azure, obejmują usprawnienia następujących operacji:

  • Rzadko stosowane konwersje typów danych. Obejmuje następujące elementy:

    • Float/integer to/from datetime/smalldatetime

    • Real/float to/from numeric/money/smallmoney

    • Przestaw na Real

  • Niektóre przypadki DatePart /DateDiff i stopnie

  • Konwertowanie wykorzystujące styl o wartości null

Aby użyć tych ulepszeń w celu wyrażenia oceny w aplikacji, Zmień poziom zgodności baz danych na 130 (w przypadku programu SQL Server 2016) lub 140 (w przypadku programu SQL Server 2017 i usługi Azure SQL Database). Aby uzyskać więcej informacji na temat wszystkich zmian i niektórych przykładów przedstawiających zmiany, zobacz dodatek A.

Wyniki wyrażenia mogą być zachowywane w następujących strukturach bazy danych:

  • Dane tabeli podlegające ograniczeniom check

  • Utrwalone kolumny obliczane

  • Indeksy używające kolumn obliczanych w kluczu lub w kolumnach z uwzględnieniem

  • Indeksy filtrowane

  • Widoki indeksowane

Rozpatrzmy następujący scenariusz:

  • Masz bazę danych utworzoną za pomocą starszej wersji programu SQL Server lub utworzoną już w programie SQL Server 2016 lub nowszej wersji, ale na poziomie zgodności 120 lub starszym.

  • Użytkownik używa dowolnych wyrażeń, których precyzja została ulepszona w ramach definicji utrwalonych struktur w bazie danych.

W tym scenariuszu mogą wystąpić utrwalone struktury, których dotyczą usprawnienia, które zostały zaimplementowane przy użyciu poziomu zgodności 130 lub wyższego. W takim przypadku zalecamy sprawdzenie poprawności utrwalonych struktur i odbudowanie dowolnej struktury, której dotyczy problem.

Jeśli struktury miały wpływ, a po zmianie poziomu zgodności nie zostaną one odbudowane, mogą wystąpić nieco inne wyniki kwerendy. Wyniki są zależne od tego, czy użyto określonego indeksu, kolumny obliczanej lub widoku, oraz czy dane w tabeli mogą być traktowane jako naruszenie ograniczeń..

 

Uwaga Flaga śledzenia 139 w programie SQL Server

Globalna flaga śledzenia 139 jest wprowadzana w programie SQL Server 2016 CU3 i Service Pack (SP) 1 w celu wymuszenia poprawienia semantyki konwersji w zakresie poleceń DBCC sprawdzających polecenia, takie jak DBCC CHECKDB, DBCC CHECKTABLE i DBCC CheckConstraints po przeanalizowaniu ulepszonych reguł precyzji i konwersji, które zostały wprowadzone z poziomem zgodności 130 w bazie danych o wcześniejszym poziomie zgodności.

 

Ostrzeżenie

Flaga śledzenia 139 nie jest przewidziana do ciągłego włączania w środowisku produkcyjnym i powinna być używana wyłącznie w celu wykonywania testów sprawdzania poprawności bazy danych opisanych w tym artykule. Dlatego należy go wyłączyć przy użyciu polecenia DBCC TRACEOFF (139,-1) w tej samej sesji po zakończeniu sprawdzania poprawności.

Flaga śledzenia 139 jest obsługiwana począwszy od programu SQL Server 2016 CU3 i programu SQL Server 2016 SP1.

Aby uaktualnić poziom zgodności, wykonaj następujące czynności:

  1. Wykonywanie walidacji w celu zidentyfikowania wszystkich utrwalonych struktur utrwalonych:

    1. Włącz flagę śledzenia 139, uruchamiając polecenie DBCC TRACEON (139,-1).

    2. Uruchom polecenia DBCC CHECKDB/Table i CheckConstraints .

    3. Wyłącz flagę śledzenia 139, uruchamiając polecenie DBCC TRACEOFF (139,-1).

  2. Zmień poziom zgodności bazy danych na 130 (w przypadku programu SQL Server 2016) lub 140 (w przypadku programu SQL Server 2017 i usługi Azure SQL Database).

  3. Odbuduj wszystkie struktury zidentyfikowane w kroku 1.

Uwaga Flagi śledzenia w bazie danych SQL Azure

Ustawianie flag śledzenia nie jest obsługiwane w usłudze Azure SQL Database. Dlatego przed wykonaniem walidacji należy zmienić poziom zgodności:

  1. Uaktualnij poziom zgodności bazy danych do 140.

  2. Sprawdzać poprawność w celu zidentyfikowania wszystkich utrwalonych utrwalonych struktur.

  3. Odbuduj struktury zidentyfikowane w kroku 2.

  • Dodatek a zawiera szczegółową listę wszystkich ulepszeń precyzyjnych i zapewnia przykład dla każdego z nich.

  • Dodatek B zawiera szczegółowy proces krok po kroku dotyczący sprawdzania poprawności i odbudowania wszystkich struktur, których dotyczy problem.

  • Dodatki C i D zawierają skrypty ułatwiające przeidentyfikowanie potencjalnie dotkniętych Cię obiektów w bazie danych. W związku z tym można przetwarzać swoje operacje sprawdzania poprawności i generować odpowiednie skrypty, aby uruchomić testy. Aby najłatwiej ustalić, czy w przypadku wszystkich utrwalonych struktur w bazach danych występuje poprawa precyzji w ramach poziomu zgodności 130, uruchom skrypt w dodatku D w celu wygenerowania poprawnych testów sprawdzania poprawności, a następnie uruchom ten skrypt, aby przeprowadzić weryfikację.

 

Dodatek A: zmiany w poziomie zgodności 130

Ten dodatek zawiera szczegółowe listy ulepszeń dotyczących oceny wyrażeń w 130 poziomu zgodności. Każda zmiana zawiera powiązane zapytanie przykładowe. Za pomocą tych zapytań można pokazywać różnice między wykonywaniem w bazie danych, w której jest używany poziom zgodności sprzed 130 w porównaniu z bazą danych, w której jest używany poziom zgodności 130.  

W poniższych tabelach przedstawiono listę konwersji typów danych i operacje dodatkowe.

 

Przed

Do

Zmiana

Przykładowe zapytanie

Wynik dla poziomu zgodności < 130

Wynik dla poziomu zgodności = 130

float, Real, numeric, decimal, Money lub smallmoney

DateTime lub smalldatetime

Zwiększanie dokładności zaokrąglania. Poprzednio, dnia i godziny były konwertowane oddzielnie, a wyniki zostały obcięte przed ich połączeniem.

DECLARE @f FLOAT = 1,2

DECLARE @d DATETIME = @f

Wybierz pozycję CAST (@d jako FLOAT).

1.19999996141975

1.2

zmiennej

bigint, int lub smallint

Ujemna wartość DateTime, w przypadku której część godziny jest równa co najmniej pół dnia, jest zaokrąglana w nieprawidłowy sposób (wynik jest wyłączony przez 1).

DECLARE @h DATETIME =-0,5

Zaznaczanie @h, RZUTowanie (@h jako INT)

0,4

-1

DateTime lub smalldatetime

float, Real, numeric, Money lub smallmoney

Ulepszono dokładność ostatnich 8 bitów precyzji w określonych przypadkach.

DECLARE @p0 DATETIME = ' 1899-12-31 23:58:00.470 '

DECLARE @f FLOAT = CONVERT (FLOAT, @p0)

Wybierz pozycję @f, RZUTowanie (@f jako VARBINARY (8))

-0.00138344907407406, 0xBF56AA9B21D85800

-0.00138344907407407, 0xBF56AA9B21D8583B

przestawne

stoją

Kontrole granic są mniej rygorystyczne.

WYBIERZ POZYCJĘ CAST (3.40282347000 E + 038 JAKO REAL)

Przepełnienie arytmetyczne

3.402823E+38

wartości liczbowe, pieniądze i smallmoney

przestawne

Gdy skala wejściowa ma wartość zero, po połączeniu czterech części liczbowych jest zaokrąglana dokładność.

DECLARE @n liczb (38; 0) = 41538374868278625639929991208632320

DECLARE @f FLOAT = CAST (@n jako FLOAT)

Wybierz pozycję Konwertuj (format BINARNy (8), @f)

0x4720000000000000

0x4720000000000001

wartości liczbowe, pieniądze i smallmoney

przestawne

Gdy skala wejściowa jest różna od zera, po podzieleniu przez 10-skalę jest zaokrąglana dokładność.

DECLARE @n liczb (18; 10) = 12345678,0123456781

DECLARE @f FLOAT = CAST (@n jako FLOAT)

Wybierz pozycję CAST (@f jako BINARNy (8))

0x41678C29C06522C4

0x41678C29C06522C3

rzeczywista lub ruchoma

cyfry

Ulepszono dokładność zaokrąglania w kilku przypadkach.

DECLARE @f Float = 0.14999999999999999

Wybierz pozycję CAST (@f jako wartość liczbowa (1; 1)).

0.2

0.1

rzeczywista lub ruchoma

cyfry

Ulepszona precyzja w przypadku zaokrąglenia do ponad 16 cyfr w kilku przypadkach.

DECLARE @v dziesiętna (38; 18) = 1E – 18

Wybierz @v

0.000000000000000000

0.000000000000000001

rzeczywista lub ruchoma

pieniądze lub smallmoney

Ulepszona dokładność podczas konwertowania dużych liczb w niektóre przypadki.

DECLARE @f float = 2SET @f = POWER (@f, 49) + POWER (@f,-2)

Wybierz pozycję CAST (@f jako pieniądze).

562949953421312.2048

562949953421312.25

'n (var) char

cyfry

Dane wejściowe o długości większej niż 39 nie zawsze wyzwalają przepełnienie arytmetyczne.

DECLARE @value nchar (100) = "1.11111111111111111111111111111111111111"

Wybierz pozycję CAST (@value jako dziesiętna (2; 1))

Przepełnienie arytmetyczne

1.1

'n (var) char

wersją

Obsługuje wiodące spacje i znaki.

DECLARE @value nvarchar (100) = ' 1 '

Wybierz pozycję CAST (@value jako bit).

Podczas konwertowania wartości nvarchar ' 1 ' na bit typu danych nie powiodło się konwertowanie.

1

zmiennej

czas lub datetime2

Ulepszona precyzja podczas konwertowania na typy danych typu Data/godzina z większą precyzją. Należy pamiętać, że wartości datetime są przechowywane jako znaczniki reprezentujące 1/300th sekundy. Nowsze typy czasu i datetime2 przechowują nieprecyzyjną liczbę cyfr, gdzie liczba cyfr jest taka sama jak precyzja.

DECLARE @value DateTime = ' 1900-01-01 00:00:00.003 '

Wybierz pozycję CAST (@value jako czas (7)).

00:00:00.0030000

00:00:00.0033333

czas lub datetime2

zmiennej

Ulepszone zaokrąglanie w kilku przypadkach.

DECLARE @value (4) = "00:00:00.0045"

Wybierz pozycję CAST (@value jako wartość DateTime).

1900-01-01 00:00:00.007

1900-01-01 00:00:00.003

 

Operacji

Zmiana

Przykładowe zapytanie

Wynik dla poziomu zgodności <130

Wynik dla poziomu zgodności 130

Używanie funkcji wbudowanych w radianach lub stopniach , która używa typu danych numeric.

Stopnie dzieli się na pi/180, a poprzednio pomnożone przez 180/PI. Podobne do radia.

DECLARE @arg1 liczbowy = 1

Wybierz pozycję STOPnie (@arg1)

57.295779513082323000

57.295779513082322865

Dodawanie liczb lub odejmowanie, gdy skala jednego operandu jest większa niż Skala wyniku.

Zaokrąglanie zawsze występuje po dodaniu/odejmowaniu, ale czasami może wystąpić wcześniej.

DECLARE @p1 liczb (38; 2) =-1,15

DECLARE @p2 liczb (38; 1) = 10

Wybierz pozycję @p1 + @p2

8.8

8.9

Konwertuj z stylem null .

Funkcja Konwertuj z stylem null zawsze zwraca wartość null , jeśli typ docelowy jest wartością liczbową.

WYBIERZ POZYCJĘ KONWERTUJ (SMALLINT; "0"; NULL);

0,4

NULL

DatePart , w którym jest używana opcja mikrosekund lub nanosekund z typem danych DateTime.

Wartość nie jest już obcinana na poziomie milisekund przed konwertowaniem na mikro lub nanosekundę.

DECLARE @dt DATETIME = ' 01-01-1900 00:00:00.003 ';

Wybierz pozycję DATEPART (MICROSECOND, @dt);

3000

3333

Funkcja DateDiff , która korzysta z opcji mikrosekund lub nanosekund z typem danych DateTime.

Wartość nie jest już obcinana na poziomie milisekund przed konwertowaniem na mikro lub nanosekundę.

DECLARE @d1 DATETIME = ' 1900-01-01 00:00:00.003 '

DECLARE @d2 DATETIME = ' 1900-01-01 00:00:00.007 '

Wybierz opcję DATEDIFF (MICROSECOND, @d1, @d2)

3000

3333

Porównanie wartości datetime i datetime2 z wartościami niezerowymi w milisekundach.

Wartość DateTime nie jest już obcinana na poziomie milisekund, gdy jest przeprowadzane porównanie z wartością datetime2. Oznacza to, że określone wartości, które dotychczas były porównywane, nie są już porównywane.

DECLARE @d1 DATETIME = ' 1900-01-01 00:00:00.003 '

DECLARE @d2 DATETIME2 (3) = @d1

Wybierz pozycję CAST (@d1 jako datetime2 (7)), @d2SELECT CASE (@d1 = @d2), a następnie przycisk "tak" nie równa się "koniec

1900-01-01 00:00:00.0030000, 1900-01-01 00:00:00.003

mniejsza

1900-01-01 00:00:00.0033333, 1900-01-01 00:00:00.003

nierównych

Funkcja Round używająca typu danych float.

Wyniki zaokrąglania są różne.

WYBIERZ POZYCJĘ ZAOKRĄGLANIE (RZUTOWANIE (-0,4175 JAKO FLOAT), 3)

-0.418

-0.417

 

Dodatek B: czynności weryfikowania i aktualizowania utrwalonych struktur

Zalecamy określenie, czy baza danych zawiera jakiekolwiek utrwalone struktury, na które mają wpływ zmiany w poziomie zgodności 130, i odbudowa wszystkich struktur, których dotyczy problem.

Należy pamiętać , że dotyczy to tylko utrwalonych struktur utworzonych w bazie danych w STARSZEJ wersji programu SQL Server lub przy użyciu poziomu zgodności niższego niż 130. W przypadku utrwalonych struktur, które mogą mieć potencjalnie wpływ na następujące elementy:

  • Dane tabeli podlegające ograniczeniom check

  • Utrwalone kolumny obliczane

  • Indeksy używające kolumn obliczanych w kluczu lub w kolumnach z uwzględnieniem

  • Indeksy filtrowane

  • Widoki indeksowane

W takiej sytuacji należy wykonać poniższą procedurę.  

  1. Sprawdź poziom zgodności bazy danych, używając procedury udokumentowanej w celu wyświetlenia lub zmiany poziomu zgodności bazy danych.

  2. Jeśli poziom zgodności bazy danych jest niższy niż 130, zalecamy wykonanie sprawdzania poprawności, które zostało opisane w kroku 2 przed zwiększeniem poziomu zgodności na 130.

Określ, czy baza danych zawiera wszystkie utrwalone struktury, na które ma wpływ ulepszona logika precyzji i konwersji w poziomie zgodności 130 w jednym z następujących sposobów:

  • Polecenie DBCC CHECKDB z EXTENDED_LOGICAL_CHECKS, co powoduje sprawdzenie poprawności wszystkich struktur w bazie danych.

  • Polecenie DBCC CHECKTABLE z EXTENDED_LOGICAL_CHECKS, które sprawdza poprawność struktur powiązanych z jedną tabelą.

Opcja z EXTENDED_LOGICAL_CHECKS jest wymagana w celu upewnienia się, że wartości trwałe są porównywane z obliczonymi wartościami, oraz w celu określenia przypadków, w których występuje różnica. Ponieważ te testy są obszerne, środowisko uruchomieniowe instrukcji DBCC , które używają tej opcji, jest znacznie dłuższe niż uruchamianie instrukcji DBCC bez opcji. Dlatego rekomendacja dla dużych baz danych ma na celu wyszukanie poszczególnych tabel za pomocą instrukcji DBCC CHECKTABLE .

Polecenia DBCC CheckConstraints można użyć w celu sprawdzenia poprawności ograniczeń check . Tej instrukcji można użyć zarówno w bazie danych, jak i na poziomie tabeli.

Należy pamiętać, że instrukcje DBCC Check * powinny być zawsze uruchamiane w oknie konserwacji, z powodu potencjalnego wpływu testów na obciążenie pracą online.

Sprawdzanie poprawności na poziomie bazy danych

Sprawdzanie poprawności na poziomie bazy danych jest odpowiednie dla małych i średnich baz danych. Używaj sprawdzania poprawności na poziomie tabeli dla dużych baz danych.

Polecenie DBCC CHECKDB z EXTENDED_LOGICAL_CHECKS służy do sprawdzania poprawności wszystkich utrwalonych struktur w bazie danych.

Polecenie DBCC CheckConstraints służy do sprawdzania poprawności wszystkich ograniczeń check w bazie danych.

POLECENIE DBCC CHECKCONSTRAINTS

Polecenie DBCC CheckConstraints służy do sprawdzania integralności ograniczeń.

Użyj następującego skryptu, aby sprawdzić poprawność bazy danych:

Użyj [database_name]

WYKRACZA

DBCC TRACEON (139;-1)

WYKRACZA

POLECENIE DBCC CHECKCONSTRAINTS

WYKRACZA

DBCC TRACEOFF (139;-1)

WYKRACZA

Użycie flagi Trace zapewnia, że testy są wykonywane przy użyciu ulepszonej logiki precyzji i konwersji na poziomie zgodności 130, wymusza prawidłową semantykę konwersji nawet wtedy, gdy baza danych ma niższy poziom zgodności.

Jeśli instrukcja CheckConstraints została zakończona i nie zostanie zwrócony zestaw wyników, nie trzeba wykonywać żadnych dodatkowych czynności.

Jeśli instrukcja zwróci zestaw wyników, każdy wiersz w wynikach wskazuje na naruszenie ograniczenia, a ponadto uwzględnia wartości naruszające ograniczenie.

  • Zapisywanie nazw tabel i ograniczeń wraz z wartościami, które spowodowały naruszenie wartości (kolumny WHERE w zestawie wyników).

W poniższym przykładzie pokazano tabelę z ograniczeniem check , a jeden wiersz spełniający ograniczenie w przypadku niższych poziomów zgodności, ale narusza ograniczenie w obszarze poziomu zgodności 130.

ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL = 120

WYKRACZA

Tworzenie tabeli dbo. Tabela1

(

Data/godzina w komórce C2,

Data/godzina C3,

C4 int,

Klauzula CONSTRAINT chk1 (C4 = (DATEDIFF = MS; C2; C3)))

)

WYKRACZA

Wstawianie wartości tabeli dbo. Tabela1 (C2, C3, C4)

(

Convert (DateTime, 1900-01-01 00:00:00.997 '),

Convert (DateTime, 1900-01-01 00:00:01 '), 3)

WYKRACZA

DBCC TRACEON (139;-1)

WYKRACZA

POLECENIE DBCC CHECKCONSTRAINTS

WYKRACZA

DBCC TRACEOFF (139;-1)

WYKRACZA  

Polecenie CHECKCONSTRAINT retuRNS następujące wyniki.

Tworząc

Element

Dokąd

[dbo].[table1]

[chk1]

[C2] = "1900-01-01 00:00:00.997" i [C3] = "1900-01-01 00:00:01.000" i [C4] = "3"

Ten wynik oznacza, że ograniczenie [chk1] jest naruszone dla kombinacji wartości kolumn w elemencie WHERE.

POLECENIE DBCC CHECKDB Z EXTENDED_LOGICAL_CHECKS

Polecenie DBCC CHECKDB z EXTENDED_LOGICAL_CHECKS sprawdza wszystkie utrwalone struktury bazy danych. Jest to najbardziej wygodna opcja, ponieważ Pojedyncza instrukcja sprawdza wszystkie struktury bazy danych. Ta opcja nie jest jednak odpowiednia dla dużych baz danych z powodu oczekiwanego czasu wykonywania instrukcji.

Użyj następującego skryptu, aby sprawdzić poprawność całej bazy danych:

Użyj [database_name]

WYKRACZA

DBCC TRACEON (139;-1)

WYKRACZA

DBCC CHECKDB Z EXTENDED_LOGICAL_CHECKS, NO_INFOMSGS, TABLERESULTS

WYKRACZA

DBCC TRACEOFF (139;-1)

WYKRACZA

Użycie flagi Trace zapewnia, że testy są wykonywane przy użyciu ulepszonej logiki precyzji i konwersji na poziomie zgodności 130, wymusza prawidłową semantykę konwersji nawet wtedy, gdy baza danych ma niższy poziom zgodności.

Jeśli instrukcja CHECKDB zostanie ukończona pomyślnie, nie trzeba wykonywać żadnych dodatkowych czynności.

Jeśli instrukcja została ukończona z błędami, wykonaj następujące czynności:

  1. Zapisz wyniki na podstawie wykonania instrukcji DBCC , którą można znaleźć w okienku wiadomości w programie SQL Server Management Studio (SSMS) w pliku.

  2. Sprawdzanie, czy wszystkie zgłoszone błędy są powiązane z utrwalonymi strukturami

Tabela 1: utrwalone struktury i odpowiadające im komunikaty o błędach dotyczące niespójności  

Typ struktury, którego dotyczy problem

Obserwowane komunikaty o błędach

Weź pod uwagę

Utrwalone kolumny obliczane

Msg 2537, błąd poziomu 16Table: identyfikator obiektu <object_id>, identyfikator indeksu <index_id>,. Sprawdzanie rekordu (prawidłowa kolumna obliczana) nie powiodła się. Wartości.

Identyfikator obiektu <object_id> i identyfikator indeksu <index_id>

Indeksy odwołujące się do kolumn obliczanych w kluczu lub uwzględnionych kolumnach

Indeksy filtrowane

Msg 8951

Błąd tabeli: tabela "<table_name>" (identyfikator <object_id>). Wiersz danych nie ma zgodnego wiersza indeksu w indeksie "<index_name>" (identyfikator <index_id>)

And/or

Msg 8952

Błąd tabeli: tabela "<table_name>" (identyfikator <table_name>). Wiersz indeksu w indeksie "" (identyfikator <index_id>) nie pasuje do żadnego wiersza danych

Ponadto mogą występować błędy Dodatkowe 8955 i/lub 8956. Dane te zawierają szczegółowe informacje na temat pożądanych wierszy, na które wpływa. W tym ćwiczeniu można je nie brać pod uwagę.

Identyfikator obiektu <object_id> i identyfikator indeksu <index_id>

Widoki indeksowane

Msg 8908

Widok indeksowany "<view_name>" (identyfikator obiektu <object_id>) nie zawiera wszystkich wierszy, które produkuje definicja widoku.

And/or

Msg 8907The widok indeksowany "<view_name>" (identyfikator obiektu <object_id>) zawiera wiersze, które nie zostały przedstawione w definicji widoku.

Identyfikator obiektu <object_id>

Po zakończeniu sprawdzania poprawności na poziomie bazy danych przejdź do kroku 3.

Sprawdzanie poprawności na poziomie obiektu

W przypadku większych baz danych warto sprawdzać poprawność struktur i ograniczeń jednej tabeli lub jednego widoku w celu zmniejszenia rozmiaru okien obsługi lub ograniczać rozszerzone testy logiczne tylko do potencjalnie dotkniętych obiektów.

Użyj zapytań w dodatku C w celu zidentyfikowania potencjalnie dotkniętych tabel. Skrypt w dodatku D może być wykorzystywany do generowania ograniczeń CHECKTABLE i CheckConstraints na podstawie zapytań wymienionych w dodatku C.

POLECENIE DBCC CHECKCONSTRAINTS

Aby sprawdzić ograniczenia związane z jedną tabelą lub widokiem, użyj następującego skryptu:

Użyj [database_name]

WYKRACZA

DBCC TRACEON (139;-1)

WYKRACZA

DBCC CHECKCONSTRAINTS ()

WYKRACZA

DBCC TRACEOFF (139;-1)

WYKRACZA

Użycie flagi Trace zapewnia, że testy są wykonywane przy użyciu ulepszonej precyzji i logiki konwersji zgodnej z poziomem zgodności 130, wymusza ulepszoną semantykę nawet wtedy, gdy baza danych ma niższy poziom zgodności.

Jeśli instrukcja CheckConstraints została zakończona i nie zostanie zwrócony zestaw wyników, nie trzeba wykonywać żadnych dodatkowych czynności.

Jeśli instrukcja zwróci zestaw wyników, każdy wiersz w wynikach wskazuje na naruszenie ograniczenia, a także zawiera wartości naruszające ograniczenie.

  • Zapisz nazwy tabel i ograniczeń wraz z wartościami, które spowodowały naruszenie (kolumna miejsca w zestawie wyników).

POLECENIE DBCC CHECKTABLE Z EXTENDED_LOGICAL_CHECKS

Aby sprawdzić poprawność utrwalonych struktur związanych z jedną tabelą lub widokiem, użyj następującego skryptu:

Użyj [database_name]

WYKRACZA

DBCC TRACEON (139;-1)

WYKRACZA

DBCC CHECKTABLE () Z EXTENDED_LOGICAL_CHECKS, NO_INFOMSGS, TABLERESULTS

WYKRACZA

DBCC TRACEOFF (139;-1)

WYKRACZA

Jeśli instrukcja CHECKTABLE została pomyślnie ukończona, nie trzeba wykonywać żadnych dodatkowych czynności.

Jeśli instrukcja została ukończona z błędami, wykonaj następujące czynności:

  1. Zapisz wyniki na podstawie wykonania instrukcji DBCC , która znajduje się w okienku wiadomości w programie SSMSE, do pliku.

  2. Sprawdź, czy wszystkie zgłoszone błędy są powiązane z utrwalonymi strukturami wymienionymi w tabeli 1.

Po zakończeniu sprawdzania poprawności na poziomie tabeli przejdź do kroku 3.

Jeśli poziom zgodności bazy danych już jest 130, możesz pominąć ten krok.

Poziom zgodności bazy danych można zmienić na 130 przy użyciu następującego skryptu:

Użyj [database_name]

WYKRACZA

ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL = 130

WYKRACZA

Uwaga

Ponieważ w ramach poziomu zgodności 130 istnieją zmiany optymalizatora zapytań, zalecamy włączenie magazynu zapytań przed zmianą poziomu zgodności. Aby uzyskać więcej informacji, zobacz zachowanie stabilności wydajności podczas uaktualniania do programu SQL Server 2016.

Jeśli podczas sprawdzania poprawności przeprowadzonym w kroku 2 nie znaleziono żadnych niespójności, użytkownik wykonuje uaktualnienie i może pominąć ten krok.

Jeśli w kroku 2 odnaleziono niespójności, wymagane są dodatkowe akcje w celu usunięcia niespójności z bazy danych. Wymagane działania zależą od rodzaju struktury, której dotyczy problem.

Ważne

Wykonaj czynności naprawcze w tym kroku tylko po zmianie poziomu zgodności bazy danych na 130.

Wykonywanie kopii zapasowej bazy danych (lub baz danych)

Zalecamy wykonanie pełnej kopii zapasowej bazy danych przed wykonaniem dowolnej akcji, którą opisano w poniższej sekcji. W przypadku korzystania z bazy danych Azure SQL Database nie trzeba wykonywać kopii zapasowej. Możesz zawsze powracać do tyłu, korzystając z funkcji przywracania w czasie, aby pozostały czas na wypadek problemów z dowolną aktualizacją.

Ograniczenia CHECK

Korygowanie warunków naruszenia ograniczenia check wymaga modyfikacji danych w tabeli lub ograniczenia check .

Na podstawie nazwy ograniczenia (uzyskanego w kroku 2) można uzyskać definicję ograniczenia w następujący sposób:

Wybierz pozycję definicja z tabeli sys. check_constraints

GDZIE object_id = OBJECT_ID (N "constraint_name")

Aby sprawdzić, których wierszy tabeli dotyczy problem, możesz użyć informacji o miejscu, które zostały wcześniej zwrócone przez instrukcję DBCC CheckConstraints :

ZAZNACZYSZ

FROM [schema_name]. [table_name]

GDZIE Where_clause

Musisz zaktualizować odpowiednie wiersze lub zmienić definicję ograniczenia, aby upewnić się, że ograniczenie nie jest naruszone.

Aktualizowanie danych tabeli

Nie ma żadnej ostatecznej reguły określającej sposób aktualizacji danych. Ogólnie, w przypadku każdej innej instrukcji WHERE zwróconej przez polecenie DBCC CheckConstraints, należy uruchomić następującą instrukcję Update:

UPDATE [schema_name]. [table_name] Ustawianie new_column_values

GDZIE Where_clause

Uwzględnij następującą tabelę przykładową z ograniczeniem i wierszem, który narusza ograniczenie w poziomie zgodności 130:

ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL = 120

wykracza

Tworzenie tabeli dbo. Tabela1

(

Data/godzina w komórce C2,

Data/godzina C3,

C4 int,

Klauzula CONSTRAINT chk1 (C4 = (DATEDIFF = MS; C2; C3)))

)

WYKRACZA

Wstawianie wartości tabeli dbo. Tabela1 (C2, C3, C4)

(Convert (DateTime; "1900-01-01 00:00:00.997");

Convert (DateTime, 1900-01-01 00:00:01 '), 3)

WYKRACZA

W tym przykładzie ograniczenie jest proste: wartość w kolumnie C4 musi być równa wartości wyrażenia obejmującego C2 i C3. Aby zaktualizować tabelę, przypisz tę wartość do C4:

ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL = 130

WYKRACZA

Aktualizowanie witryny dbo. Tabela1 SET C4 = DateDiff (MS; C2; C3)

WHERE [C2] = ' 1900-01-01 00:00:00.997 ' i [C3] = ' 1900-01-01 00:00:01.000 ' i [C4] = ' 3 '

WYKRACZA

Należy zauważyć, że klauzula WHERE używana w instrukcji UPDATE odpowiada informacjom o miejscu zwróconym przez polecenie DBCC CheckConstraints.

Aktualizowanie ograniczenia CHECK

Aby zmienić ograniczenie check , należy upuścić je i utworzyć ponownie. Zalecamy wykonanie obu transakcji w tej samej transakcji, na przykład w przypadku problemów z zaktualizowaną definicją ograniczenia. Możesz użyć poniższego kodu Transact-SQL:

ROZPOCZNIJ TRANSAKCJĘ

ALTER TABLE [schema_name]. [table_name]

Usuwanie ograniczenia [constraint_name]

ALTER TABLE [schema_name]. [table_name]

Dodaj ograniczenie [constraint_name]

Sprawdzanie (new_constraint_definition)

DEKLARACJI

WYKRACZA

W poniższym przykładzie jest aktualizowany chk1 ograniczenia w dbo. Tabela1:

ROZPOCZNIJ TRANSAKCJĘ

ALTER TABLE dbo. Tabela1

Usuń chk1 ograniczenia

ALTER TABLE dbo. Tabela1

Dodaj chk1 ograniczenia

CHECK (C4 <= DATEDIFF (MS; C2; C3))

DEKLARACJI

WYKRACZA

Utrwalone kolumny obliczane

Najprostszym sposobem zaktualizowania utrwalonych kolumn obliczanych jest zaktualizowanie jednej z kolumn, do których odwołuje się kolumna obliczana. Nowa wartość kolumny może być taka sama jak stara wartość, co spowoduje, że operacja nie zmieni żadnych danych użytkownika.

Wykonaj poniższe czynności w odniesieniu do każdego object_id związanych z niespójnością w kolumnach obliczanych zanotowanych w kroku 2.

  1. Identyfikuj kolumny obliczane:

    • Uruchom następujące zapytanie, aby pobrać nazwę tabeli i nazwy utrwalonych kolumn obliczanych dla zanotowanych object_id:

      Wybierz CUDZYSŁÓW (s. Name) + N '. ' + CUDZYSŁÓWname (t. Name) jako "Tabela",

      CUDZYSŁÓWname (C1. nazwa) jako "utrwalona kolumna obliczeniowa";

      C1. column_id jako "computed_column_id";

      Definicja jako "computed_column_definition"

      Z tabeli sys. Tables t

      Dołącz do widoku sys. computed_columns C1 w usłudze t. object_id = C1. object_id

      I C1. is_persisted = 1

      Dołącz do widoku sys. schematy s na t. schema_id = s. schema_id

      GDZIE t. object_id = object_id

  2. Identyfikuj kolumny, do których odwołuje się odwołanie:

    • Uruchom następujące zapytanie, aby zidentyfikować kolumny, do których odwołuje się kolumna obliczana. Zanotuj jedno z referenced_column_names:

      Wybierz CUDZYSŁÓW (s. Name) + N '. ' + CUDZYSŁÓWname (o. Name) jako "obiekt odwołujący się",

      o. type_desc jako "typ obiektu", referenced_minor_id jako "referenced_column_id", c.name jako "referenced_column_name"

      Z poziomu widoku sys. sql_expression_dependencies SED

      Dołącz do widoku sys. computed_columns C1 na SED. referencing_id = C1. object_id i SED. referencing_minor_id = C1. column_id

      Dołącz do widoku sys. Objects o: SED. referencing_id = o. object_id

      Dołącz do widoku sys. schematy s na o. schema_id = s. schema_id

      Dołącz do tabeli sys. Columns c in o. object_id = c. object_id i SED. referenced_minor_id = c. column_id

      GDZIE referencing_class = 1 i referenced_class = 1 oraz referencing_id = object_id i referencing_minor_id = computed_column_id

  3. Uruchom instrukcję Update obejmującą pojedynczą liczbę kolumn, do których istnieją odwołania, aby wyzwolić aktualizację kolumny obliczanej:

    • Poniższa instrukcja wyzwoli aktualizację kolumny, do której odwołuje się kolumna obliczana, a także wyzwoli aktualizację kolumny obliczanej.

      UPDATE [schema_name]. [table_name]

      SET referenced_column_name = ISNULL (referenced_column_name referenced_column_name)

    • Wyrażenie ISNULL w instrukcji jest przystosowane w taki sposób, aby wartość pierwotnej kolumny nie była zmieniana, a mimo to upewnić się, że kolumna obliczana jest aktualizowana przy użyciu logiki oceny wyrażenia w ramach usługi bazy danych 130.

    • Należy pamiętać, że w przypadku bardzo dużych tabel może nie być konieczne zaktualizowanie wszystkich wierszy w jednej transakcji. W takim przypadku można uruchomić aktualizację w partiach, dodając klauzulę WHERE do instrukcji UPDATE identyfikującej zakres wierszy. na przykład na podstawie klucza podstawowego.

  4. Identyfikuj indeksy odwołujące się do kolumny obliczanej.

    Wybierz i.name jako [nazwa indeksu]

    Z poziomu widoku sys. index_columns, a następnie w tabeli MF. object_id = i. object_id i IC. index_id = i. index_id

    GDZIE i. object_id = object_id i IC. column_id = computed_column_id

To zapytanie identyfikuje indeksy, które odwołują się do utrwalonej kolumny obliczanej. Każdy taki indeks musi zostać odbudowany. Aby to zrobić, wykonaj czynności opisane w poniższej sekcji.

Indeksy, indeksy filtrowane i widoki indeksowane

Niespójności indeksów odpowiadają błędom 8951 i 8952 (w przypadku tabel) lub 8907 i 8908 (w przypadku widoków) w wynikach DBCC CHECK * z kroku 2.

Aby naprawić te niespójności, uruchom polecenie DBCC CHECKTABLE z REPAIR_REBUILD. Spowoduje to naprawienie struktur indeksów bez utraty danych. Jednak baza danych musi być w trybie jednego użytkownika i dlatego jest niedostępna dla innych użytkowników, gdy występuje naprawianie.

Możesz również ręcznie odbudować indeksy, których dotyczy problem. Tej opcji należy użyć, jeśli obciążenia nie mogą być pobierane w trybie offline, ponieważ odbudowanie indeksu można wykonać jako operację ONLINE (w obsługiwanych wersjach programu SQL Server).

Odbudowanie indeksów

Jeśli ustawienie bazy danych w trybie jednego użytkownika nie jest opcją, możesz indywidualnie odbudować indeksy, korzystając z instrukcji ALTER INDEX Rebuild, dla każdego indeksu zidentyfikowanego w kroku 2.

Użyj poniższej kwerendy, aby uzyskać nazwy tabeli i indeksu dla danego object_id i index_id.  

Wybierz CUDZYSŁÓW (SCHEMA_NAME (o. schema_id)) + N '. ' + CUDZYSŁÓWname (o. Name) jako "Table", i.name jako "index_name"

Z poziomu tabeli sys. obiekty o z dołączaniem do sys. indeksy i na o. object_id = i. object_id

GDZIE o. object_id = object_id oraz i. index_id = index_id

Wykonaj poniższe instrukcje, aby ponownie utworzyć indeks:


ALTER INDEX index_name ON [schema_name].[table_name] REBUILD WITH (ONLINE=ON)

Uwaga Jeśli korzystasz z wersji Standard, Web lub Express, kompilacja indeksu online nie jest obsługiwana. Dlatego opcja with (online = on) musi zostać usunięta z instrukcji ALTER index.

W poniższym przykładzie pokazano odbudowanie filtrowanego indeksu:

ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL = 120

WYKRACZA

Utwórz tabelę dbo. Tabela2

(

Data/godzina w komórce C2,

pływak (C3)

)

WYKRACZA

Wstawianie wartości dbo. tabela2 (C2, C3) (' 1899-12-31 23:58:00.470 ',-0.00138344907407406)

WYKRACZA

Tworzenie ix_1 indeksu w witrynie dbo. tabela2 (C2)

WHERE (C2 =-0.00138344907407406)

WYKRACZA

ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL = indeks 130GOALTER ix_1 w [dbo]. Tabela2 ODBUDOWANIE ZA POMOCĄ (ONLINE = WŁ)

WYKRACZA

Jeśli masz regularne plany konserwacji, Zalecamy dołączenie tego indeksu w ramach zaplanowanej konserwacji.

Naprawianie za pomocą polecenia DBCC

Dla każdego (object_id) powiązanego z indeksem z niespójnością zanotowaną w kroku 2 Uruchom następujący skrypt, aby wykonać naprawę. Ten skrypt ustawia bazę danych w trybie pojedynczego użytkownika dla operacji naprawiania. W najgorszym przypadku naprawa wykonuje odbudowanie pełnego indeksu.

Użyj [database_name]

WYKRACZA

ZMIENIANIE BIEŻĄCEGO ZESTAWU BAZY DANYCH SINGLE_USER Z NATYCHMIASTOWYM WYCOFANIEM

WYKRACZA

DBCC CHECKTABLE (object_id, REPAIR_REBUILD) z EXTENDED_LOGICAL_CHECKS, NO_INFOMSGS, TABLERESULTS

WYKRACZA

ZMIENIANIE BIEŻĄCEGO ZESTAWU BAZY DANYCH MULTI_USER

WYKRACZA

Dodatek C: zapytania określające tabele kandydatów

Poniższe skrypty identyfikują tabele kandydatów, które można sprawdzać za pomocą polecenia DBCC CHECKTABLE z EXTENDED_LOGICAL_CHECKS, na podstawie istnienia utrwalonych struktur i ograniczeń używających typów danych, na które usprawnienia zostały wprowadzone w wyniku ulepszeń na poziomie zgodności 130.

Poniższa lista zapytań zawiera szczegóły dotyczące tabel i potencjalnie dotkniętych struktur, które wymagają dodatkowej weryfikacji.

Poniższe zapytanie zwraca wszystkie widoki indeksowane odwołujące się do kolumn przy użyciu odpowiednich typów danych lub przy użyciu dowolnej z wbudowanych funkcji, których dotyczy problem:

Wybierz CUDZYSŁÓW (SCHEMA_NAME (o. schema_id)) + N '. ' + QUOTe (o. Name) jako "View", CUDZYSŁÓWname (i. Name) jako "index", QUOTe (SED. referenced_schema_name) + N '. ' + CUDZYSŁÓWname (SED. referenced_entity_name) jako "tabela, której dotyczy odwołanie, jako" kolumna (Nazwa odwołania), t.name jako "typ danych",

--Jeśli typ danych to wartość liczbowa, liczba całkowita lub pieniądze, Jedyne przypadki uzasadniające dodatkowe kontrole

--przy użyciu polecenia DBCC jest to, że definicja widoku zawiera wartość zmiennoprzecinkową lub DateTime albo konwersję na taką wartość

s.definition

Z poziomu widoku sys. sql_expression_dependencies SED

Dołącz do widoku sys. Objects o: SED. referencing_id = o. object_id i o. Type = N'V '

Dołącz do tabeli sys. indeksy i na o. object_id = i. object_id

Dołącz do widoku sys. sql_modules s na s. object_id = o. object_id

Dołącz do tabeli sys. Columns c in SED. referenced_id = c. object_id i SED. referenced_minor_id = c. column_idJOIN sys. typy t na c. system_type_id = t. system_type_id

GDZIE referencing_class = 1 i referenced_class = 1 oraz (c. system_type_id

(59 – Real

, 62--float

, 58--smalldatetime

, 61--DateTime

, 60 – pieniądze

, 122--smallmoney

, 106--Decimal

, 108--numeric

, 56--int

, 48--tinyint

, 52--smallint

, 41 — czas

, 127--bigint

) Lub s. [definicja] LIKE "% DATEDIFF%"

LUB s. [definicja] LIKE "% CONVERT%"

LUB s. [definicja] LIKE "% CAST%"

LUB s. [definicja], na przykład "% DATEPART%"

LUB s. [definicja], na przykład "% stopni%")

Poniższe zapytanie zwraca wszystkie tabele z kolumnami obliczanymi, do których odwołuje się inne kolumny, przy użyciu odpowiednich typów danych lub przy użyciu dowolnej z wbudowanych funkcji, które są zachowywane lub do których istnieje odwołanie za pomocą indeksu.

SELECT CUDZYSŁÓW (SED. referenced_schema_name) + N '. ' +

CUDZYSŁÓW (SED. referenced_entity_name) jako "tabela kandydatów z kolumną obliczaną",

CUDZYSŁÓWname (C1. nazwa) jako "kolumna obliczana", C1. is_persisted, QUOTe (C2. Name) jako "kolumna, której dotyczy odwołanie", t.name jako "typ danych",

--Jeśli typ danych to wartość liczbowa, liczba całkowita lub pieniądze, Jedyne przypadki uzasadniające dodatkowe kontrole

--za pomocą polecenia DBCC jest to, że definicja kolumny zawiera wartość zmiennoprzecinkową lub DateTime albo konwersję na taką wartość

c1.definition

Z poziomu widoku sys. sql_expression_dependencies SED

Dołącz do widoku sys. computed_columns C1 na SED. referencing_id = C1. object_id i SED. referencing_minor_id = C1. column_id

Dołącz do tabeli sys. Columns., w dniu SED. referenced_id = C2. object_id i SED. referenced_minor_id = C2. column_id

Dołącz do widoku sys. typy t na C2. system_type_id = t. system_type_idWHERE referencing_class = 1 i referenced_class = 1

AND (C2. system_type_id w

(59 – Real

, 62--float

, 58--smalldatetime

, 61--DateTime

, 60 – pieniądze

, 122--smallmoney

, 106--Decimal

, 108--numeric

, 56--int

, 48--tinyint

, 52--smallint

, 41 — czas

, 127--bigint

) Lub C1. rozdzielczości LUBISZ "% DATEDIFF%"

LUB C1. rozdzielczości LIKE "% CONVERT%"

LUB C1. rozdzielczości LIKE "% DATEPART%"

LUB C1. rozdzielczości LIKE "% STOPNI%")

DO

— kolumna jest utrwalona

c1.is_persisted=1

--LUB kolumna jest uwzględniona w indeksie

LUB istnieje (wybierz pozycję 1 z tabeli sys. index_columns IC, gdzie MF. object_id = C1. object_id i IC. column_id = C1. column_id)

)

Poniższe zapytanie zwraca wszystkie tabele z filtrowanymi indeksami, które odwołują się do kolumn w warunku filtru o typach danych, których dotyczy problem:

SELECT CUDZYSŁÓW (SED. referenced_schema_name) + N '. ' +

CUDZYSŁÓW (SED. referenced_entity_name) jako "tabela kandydatów z filtrowanym indeksem",

CUDZYSŁÓWname (i. Name) jako "indeks odwołujący się",

CUDZYSŁÓWname (c. nazwa) jako "kolumna przywoływana",

t.name jako "typ danych",

--Jeśli typ danych to wartość liczbowa, liczba całkowita lub pieniądze, Jedyne przypadki uzasadniające dodatkowe kontrole

--with DBCC wskazuje, gdzie warunek filtru zawiera wartość zmiennoprzecinkową lub DateTime.

filter_definition jako warunek filtru

Z poziomu widoku sys. sql_expression_dependencies SED

Dołącz do tabeli sys. indeksy i w obszarze SED. referencing_id = i. object_id i SED. referencing_minor_id = i. index_id

Dołącz do widoku sys. Columns c ON SED. referenced_id = c. object_id i SED. referenced_minor_id = c. column_id

Dołącz do widoku sys. typy t na c. system_type_id = t. system_type_id

GDZIE referencing_class = 7 i referenced_class = 1 i i. has_filter = 1

I c. system_type_id IN (59--Real

, 62--float

, 58--smalldatetime

, 61--DateTime

, 60 – pieniądze

, 122--smallmoney

, 106--Decimal

, 108--numeric

, 56--int

, 48--tinyint

, 52--smallint

, 41 — czas

, 127--bigint

)

 

W poniższej kwerendzie są wyświetlane wszystkie tabele z ograniczeniami Check, które odwołują się do typów danych lub funkcji wbudowanych:

SELECT CUDZYSŁÓW (SED. referenced_schema_name) + N '. ' +

CUDZYSŁÓWname (SED. referenced_entity_name) jako "kandydująca tabela z ograniczeniem Check"

Cytat (c. Name) jako "constraint_name", c. Definition AS "constraint_definition",

CUDZYSŁÓWname (Kol. nazwa) jako "kolumna, której dotyczy odwołanie", t.name jako "typ danych"

Z poziomu widoku sys. sql_expression_dependencies SED

Dołącz do widoku sys. check_constraints c na SED. referencing_id = c. object_id i SED. referencing_class = 1

Dołącz do tabeli sys. Columns, a następnie w kolumnie SED. referenced_id = Col. object_id i SED. referenced_minor_id = Col. column_id

Dołącz do sys. typy t na Col. system_type_id = t. system_type_id

GDZIE referencing_class = 1 i referenced_class = 1 oraz (Col. system_type_id

(59 – Real

, 62--float

, 58--smalldatetime

, 61--DateTime

, 60 – pieniądze

, 122--smallmoney

, 106--Decimal

, 108--numeric

, 56--int

, 48--tinyint

, 52--smallint

, 41 — czas

, 127--bigint)

LUB c. [definicja] LIKE "% DATEDIFF%"

LUB c. [definicja] LIKE "% CONVERT%"

LUB c. [definicja] LIKE "% DATEPART%"

LUB c. [definicja] LIKE "% stopni%")

 

Dodatek D: skrypt do tworzenia instrukcji CHECK *

 Poniższy skrypt łączy zapytania z poprzedniego dodatku i upraszcza wyniki, przedstawiając listę tabel i widoków w formie instrukcji CheckConstraints i CHECKTABLE .

DECLARE @CRLF nvarchar(10) = CHAR(13) + CHAR(10); DECLARE @sql nvarchar(max) = N'DBCC TRACEON(139,-1); ' + @CRLF ; SELECT @sql += N'DBCC CHECKTABLE (N''' + object_for_checktable + N''') WITH EXTENDED_LOGICAL_CHECKS, NO_INFOMSGS, TABLERESULTS; ' + @CRLF FROM ( --indexed views SELECT DISTINCT QUOTENAME(SCHEMA_NAME(o.schema_id)) + N'.' + QUOTENAME(o.name) AS 'object_for_checktable' FROM sys.sql_expression_dependencies AS sed INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id AND o.type = N'V' INNER JOIN sys.indexes AS i ON o.object_id = i.object_id INNER JOIN sys.sql_modules AS s ON s.object_id = o.object_id INNER JOIN sys.columns AS c ON sed.referenced_id = c.object_id AND sed.referenced_minor_id = c.column_id INNER JOIN sys.types AS t ON c.system_type_id = t.system_type_id WHERE referencing_class = 1 AND referenced_class=1 AND (c.system_type_id IN ( 59 --real , 62 --float , 58 --smalldatetime , 61 --datetime , 60 --money , 122 --smallmoney , 106 --decimal , 108 --numeric , 56 --int , 48 --tinyint , 52 -- smallint , 41 --time , 127 --bigint ) OR s.[definition] LIKE N'%DATEDIFF%' OR s.[definition] LIKE N'%CONVERT%' OR s.[definition] LIKE N'%CAST%' OR s.[definition] LIKE N'%DATEPART%' OR s.[definition] LIKE N'%DEGREES%') UNION --persisted computed columns SELECT DISTINCT QUOTENAME(sed.referenced_schema_name) + N'.' + QUOTENAME(sed.referenced_entity_name) AS 'object_for_checktable' FROM sys.sql_expression_dependencies AS sed INNER JOIN sys.computed_columns AS c1 ON sed.referencing_id = c1.object_id AND sed.referencing_minor_id = c1.column_id INNER JOIN sys.columns AS c2 ON sed.referenced_id=c2.object_id AND sed.referenced_minor_id = c2.column_id INNER JOIN sys.types AS t ON c2.system_type_id = t.system_type_id WHERE referencing_class = 1 AND referenced_class = 1 AND (c2.system_type_id IN ( 59 --real , 62 --float , 58 --smalldatetime , 61 --datetime , 60 --money , 122 --smallmoney , 106 --decimal , 108 --numeric , 56 --int , 48 --tinyint , 52 -- smallint , 41 --time , 127 --bigint ) OR c1.[definition] LIKE N'%DATEDIFF%' OR c1.[definition] LIKE N'%CONVERT%' OR c1.[definition] LIKE N'%DATEPART%' OR c1.[definition] LIKE N'%DEGREES%') AND ( -- the column is persisted c1.is_persisted = 1 -- OR the column is included in an index OR EXISTS (SELECT 1 FROM sys.index_columns AS ic WHERE ic.object_id = c1.object_id AND ic.column_id=c1.column_id) ) UNION --indexed views SELECT DISTINCT QUOTENAME(sed.referenced_schema_name) + N'.' + QUOTENAME(sed.referenced_entity_name) AS 'object_for_checktable' FROM sys.sql_expression_dependencies AS sed INNER JOIN sys.indexes AS i ON sed.referencing_id = i.object_id AND sed.referencing_minor_id = i.index_id INNER JOIN sys.columns AS c ON sed.referenced_id = c.object_id AND sed.referenced_minor_id = c.column_id INNER JOIN sys.types AS t ON c.system_type_id = t.system_type_id WHERE referencing_class = 7 AND referenced_class = 1 AND i.has_filter = 1 AND c.system_type_id IN ( 59 --real , 62 --float , 58 --smalldatetime , 61 --datetime , 60 --money , 122 --smallmoney , 106 --decimal , 108 --numeric , 56 --int , 48 --tinyint , 52 -- smallint , 41 --time , 127 --bigint )) AS a SELECT @sql += N'DBCC CHECKCONSTRAINTS (N''' + object_for_checkconstraints + N'''); ' + @CRLF FROM ( SELECT DISTINCT QUOTENAME(sed.referenced_schema_name) + N'.' + QUOTENAME(sed.referenced_entity_name) AS 'object_for_checkconstraints' FROM sys.sql_expression_dependencies AS sed INNER JOIN sys.check_constraints AS c ON sed.referencing_id = c.object_id AND sed.referencing_class = 1 INNER JOIN sys.columns AS col ON sed.referenced_id = col.object_id AND sed.referenced_minor_id = col.column_id INNER JOIN sys.types AS t ON col.system_type_id = t.system_type_id WHERE referencing_class = 1 AND referenced_class = 1 AND (col.system_type_id IN ( 59 --real , 62 --float , 58 --smalldatetime , 61 --datetime , 60 --money , 122 --smallmoney , 106 --decimal , 108 --numeric , 56 --int , 48 --tinyint , 52 -- smallint , 41 --time , 127 --bigint ) OR c.[definition] LIKE N'%DATEDIFF%' OR c.[definition] LIKE N'%CONVERT%' OR c.[definition] LIKE N'%DATEPART%' OR c.[definition] LIKE N'%DEGREES%') ) a SET @sql += N'DBCC TRACEOFF(139,-1);'; PRINT @sql; --to run the script immediately, use the following command: --EXECUTE sp_executesql @sql; GO

Potrzebna dalsza pomoc?

Rozwijaj swoje umiejętności
Poznaj szkolenia
Uzyskuj nowe funkcje w pierwszej kolejności
Dołącz do niejawnych testerów firmy Microsoft

Czy te informacje były pomocne?

Jaka jest jakość języka?
Co wpłynęło na Twoje wrażenia?

Dziękujemy za opinię!

×