| Termin | Definicja |
|---|---|
| SQL_VARIANT | SQL_VARIANT to typ danych mogący przechowywać wartości różnych typów, kosztem ograniczonej funkcjonalności operacji na nich. SQL_VARIANT jako typ danych w Microsoft SQL ServerSQL_VARIANT jest specjalnym typem danych dostępnym w silniku Microsoft SQL Server. Pozwala przechowywać w jednej kolumnie wartości należące do różnych obsługiwanych typów podstawowych, na przykład liczby całkowite, liczby dziesiętne, teksty, dane binarne, wartości logiczne oraz daty i godziny. Wartość zapisana jako SQL_VARIANT nie traci jednak informacji o swoim rzeczywistym typie. Silnik przechowuje zarówno dane, jak i metadane opisujące typ bazowy, a w przypadku danych tekstowych także informacje związane z sortowaniem i porównywaniem. SQL_VARIANT nie jest uniwersalnym pojemnikiem na dowolne dane. Nie można zagnieżdżać wartości SQL_VARIANT w kolejnej wartości SQL_VARIANT, a typ ma określone ograniczenia dotyczące typów bazowych i rozmiaru. W praktyce jest to mechanizm przeznaczony do sytuacji, w których schemat tabeli musi obsłużyć kilka przewidywalnych rodzajów wartości, ale jednocześnie zachować możliwość ich późniejszej identyfikacji. Nie zastępuje prawidłowo zaprojektowanego modelu danych, gdy każda właściwość ma znany i stabilny typ. Jak SQL Server przechowuje typ bazowy i metadaneKolumnę SQL_VARIANT można utworzyć w definicji tabeli, a wartość można do niej wprowadzić przez konwersję, na przykład za pomocą CAST lub CONVERT. Przykładowo liczba całkowita oraz tekst mogą trafić do tej samej kolumny, ale SQL Server będzie rozpoznawał je jako różne typy bazowe. Informację tę można odczytać funkcją SQL_VARIANT_PROPERTY, używając właściwości BaseType. Ta funkcja pozwala również sprawdzić między innymi precyzję, skalę, długość oraz właściwości sortowania przechowywanej wartości, o ile dana właściwość ma zastosowanie. Wartość SQL_VARIANT może zawierać między innymi typy liczbowe, znaki i tekst o ograniczonej długości, dane binarne, wartości daty i czasu oraz typ bit. Nie wszystkie typy występujące w SQL Server są dozwolone jako typ bazowy. Ograniczenia obejmują między innymi typy dużych obiektów, takie jak varchar(max), nvarchar(max), varbinary(max), xml, text, ntext i image. Nie można więc traktować SQL_VARIANT jako zamiennika dla kolumny przeznaczonej do przechowywania dowolnie długich dokumentów lub plików binarnych. Łączny rozmiar reprezentacji wartości SQL_VARIANT jest ograniczony do 8016 bajtów, dlatego rozmiar danych i narzut metadanych trzeba uwzględnić już na etapie projektu tabeli. Porównywanie, konwersje i zapytania z SQL_VARIANTOperacje porównania na SQL_VARIANT wymagają ostrożności, ponieważ wynik zależy nie tylko od samej wartości, lecz także od typu bazowego. SQL Server stosuje hierarchię typów SQL_VARIANT przy porównywaniu wartości należących do różnych kategorii. Wartości liczbowe mogą być porównywane według reguł właściwych dla liczb, natomiast wartości tekstowe podlegają regułom sortowania i porównywania związanym z ich metadanymi. Dwie wartości o podobnym zapisie tekstowym i liczbowym nie muszą być traktowane jak równoważne, jeżeli zostały zapisane w różnych typach. Przed wykonywaniem obliczeń często potrzebna jest jawna konwersja do konkretnego typu. SQL_VARIANT nie zapewnia bezwarunkowej zamienności z typami używanymi przez funkcje agregujące, operatory arytmetyczne ani wszystkie funkcje tekstowe. Zapytanie powinno więc najpierw rozpoznać typ wartości, a następnie zastosować odpowiedni CAST lub CONVERT. Trzeba również kontrolować przypadki, w których zawartość nie może zostać bezpiecznie przekonwertowana, na przykład tekst nie przedstawia poprawnej liczby albo liczba przekracza zakres typu docelowego. Przy filtrowaniu warto pamiętać, że niejawne konwersje mogą zmienić wynik porównania, powodować błędy albo pogorszyć wykorzystanie indeksu. Gdzie użycie SQL_VARIANT zwiększa ryzyko problemówSQL_VARIANT bywa przydatny w tabelach przechowujących heterogeniczne właściwości, gdy zestaw możliwych typów jest ograniczony, a aplikacja potrafi poprawnie interpretować metadane. Ceną jest większa złożoność zapytań, trudniejsze walidowanie wartości oraz mniej przewidywalne działanie części operatorów. W wielu projektach czytelniejsze i bezpieczniejsze jest użycie osobnych kolumn dla poszczególnych typów albo tabeli właściwości z jasno opisanym formatem danych. Takie rozwiązanie ułatwia tworzenie ograniczeń, indeksów, raportów i testów. Podczas diagnozowania problemu z kolumną SQL_VARIANT należy sprawdzić definicję tabeli, rzeczywisty typ bazowy wartości, sposób wykonywania konwersji oraz warunki porównań w zapytaniu. Pomocne jest odczytanie SQL_VARIANT_PROPERTY dla rekordów powodujących błąd i porównanie ich z rekordami działającymi prawidłowo. Należy także zweryfikować długość danych, precyzję i skalę liczb, ustawienia sortowania dla tekstu oraz występowanie wartości NULL. Przy problemach z aplikacją kliencką trzeba sprawdzić, czy sterownik i kod programu prawidłowo odczytują typ SQL_VARIANT, zamiast zakładać, że każda wartość jest tekstem albo liczbą. |