Przy użyciu danych sql_variant

The sql_variant data type operates similarly to the variant data type in Microsoft Visual Basic.sql_variant enables a single column, parameter, or variable to store data values of different data types.For example, one sql_variant kolumna can hold int, decimal, char, binary, and nchar values.Każde wystąpienie sql_variant kolumna rekordy wartość danych i informacji metadane.Obejmuje to podstawowy typ danych, maksymalny rozmiar, skalę, precyzję i sortowanie.

Zasady sql_variant

Następujące zasady stosuje się do korzystania z sql_variant typu danych.

Przypisanie wartości ogólne

  • sql_variant objects can hold data of any SQL Server data type except text, ntext, image, varchar(max), nvarchar(max), varbinary(max), xml, timestamp, and Microsoft .NET Framework common language runtime (CLR) user-defined types.Wystąpienie sql_variant danych również nie może mieć sql_variant jako jego podstawowego podstawowy typ danych.

  • Stałe dowolnego typu może być określony w predykaty lub przydziałów odwołującego się do sql_variant kolumny.

  • Jeśli sql_variant jest wartość NULL, nie jest uważane za posiadanie odpowiedniego podstawowy typ danych.Ta reguła ma zastosowanie nawet wtedy, gdy wartość null pochodzi ze zmiennej lub kolumna o typie danych.

    W poniższym przykładzie wartość VariantCol jest zestaw do NULL bez skojarzony jest typ danych, nawet jeśli wartość null pochodzi od int zmiennej:

    DECLARE @IntVar int

    SET @IntVar = NULL

    UPDATE SomeTable SET VariantCol = @IntVar WHERE PriKey = 123

  • W przypadku przydziałów z sql_variant obiektów do obiektu, który ma inny typ danych, sql_variant wartość musi jawnie rzutować na typ danych obiekt docelowy.Nie konwersje niejawne są obsługiwane, gdy sql_variant wartość jest przypisany do obiektu, który ma inny typ danych.

  • Zgodność z innymi typami danych katalogu obiektów, takich jak funkcja DŁUGOŚĆ_DANYCH, że sprawozdanie długość sql_variant obiekty raportują długość danych.Długość metadane, który jest zawarty w sql_variant obiekt nie jest zwracany.

  • sql_variant kolumny są zawsze działa z spowodowałyby na.Jeśli char, nchar, varchar, nvarchar, lub varbinary są przypisane wartości ze źródło, które ma spowodowałyby OFF, wartości nie są wypełniane.

  • Aktualizowanie jedną kolumna subskrybent prowadzi do zmiany typu podstawowego w innej kolumnie sql_variant.Poniższa procedura przedstawia tę koncepcję:

    1. Tworzenie scalonych publikacja/subskrypcja.Opublikowane tabela powinna mieć sql_variant kolumna i c1 kolumna.Dodać niektóre dane sql_variant kolumna.Podstawowy typ danych jest datetime.

    2. Po synchronizacja początkowa typ podstawowy subskrybent jest nadal datetime.

    3. Aktualizacja c1 kolumna przez subskrybenta.

    4. Dane w sql_variant kolumna Wydawca została zmieniona na datetime2.

sql_variant w tabelach

  • sql_variant kolumny można w indeksach i unikatowe klucze, jak długość danych w kolumnach klucz nie przekracza 900 bajtów.

  • sql_variantkolumny nie obsługują właściwość tożsamości, ale sql_variant kolumny są dozwolone jako część klucz podstawowy lub klucz obcy.

  • sql_variant nie można użyć kolumna w kolumna obliczana.

  • Zmienianie dowolnego typu danych z wyjątkiem kolumna przy użyciu instrukcji ALTER TABLE text, ntext, image, timestamp, lub sql_variant do sql_variant.Wszystkie istniejące wartości są konwertowane na sql_variant wartości, której podstawowy typ danych jest taka sama jak typ danych kolumna przed wykonano instrukcja ALTER TABLE.ALTER TABLE nie można zmienić typu danych sql_variant kolumna do innych danych wpisz, ponieważ nie ma żadnych obsługiwanych konwersje niejawne, z sql_variant do innych typów danych.

Sortowanie

  • Nie można użyć klauzula COLLATE sortowanie kolumna, aby przypisać sql_variant kolumna.Wartości znakowych (char, nchar, varchar, i nvarchar) w sql_variant Kolumna może być dowolny sortowanie i jednego sql_variant kolumny mogą zawierać znakowym mieszane metody sortowanie.

  • Gdy wartość jest przypisany do sql_variant wystąpienie wartości danych i podstawowy typ danych źródło są przypisywane.Jeśli źródło wartość ma sortowania, sortowanie jest przypisany.Jeśli źródło wartość ma typ danych zdefiniowany przez użytkownika, podstawowy typ danych typów danych zdefiniowanych przez użytkownika jest przypisany, nie typ danych zdefiniowany przez użytkownika.sql_variant Wystąpienie nie dziedziczy żadnych reguł lub ustawienia domyślne powiązany Typ danych zdefiniowany przez użytkownika.Jeśli wartość z kolumny z właściwością tożsamości jest przypisany do sql_variant instancji, sql_variant ma podstawowy typ danych źródło kolumny, ale nie dziedziczą właściwość tożsamości.Jest to błąd przypisać text, ntext, lub image wartość sql_variant wystąpienie.Konwersje niejawne są obsługiwane podczas przypisywania wartości z obiektów, które mają inne dane wpisuje do sql_variant obiektu.

sql_variant porównań

sql_variantkolumny mogą zawierać wartości kilku typów danych podstawowych i sortowania; Dlatego zasady szczególne stosowane podczas porównywania sql_variant operandów.Reguły te stosuje się do czynności obejmujących porównań, takie jak:

  • Transact-SQL operatory porównania

  • ORDER BY, GRUPUJ WEDŁUG

  • Indeksy

  • Maks. i MIN funkcji wartość zagregowana

  • Unia (bez wszystkie)

  • Wyrażenia sprawy

Dla sql_variant porównań, SQL Server Kolejność hierarchii typu danych są pogrupowane w danych typu rodzin.sql_variant Rodziny ma najwyższy priorytet rodziny.

Hierarchia typów danych

Typ danych rodziny

sql_variant

sql_variant

datetime

Data i godzina

smalldatetime

Data i godzina

Float

Przybliżone numeryczne

Real

Przybliżone numeryczne

decimal

Dokładne liczbowe

money

Dokładne liczbowe

smallmoney

Dokładne liczbowe

bigint

Dokładne liczbowe

int

Dokładne liczbowe

smallint

Dokładne liczbowe

tinyint

Dokładne liczbowe

bit

Dokładne liczbowe

nvarchar

Unicode

nchar

Unicode

varchar

Unicode

char

Unicode

varbinary

Binary

binary

Binary

uniqueidentifier

Uniqueidentifier

Reguły te stosuje się do sql_variant porównania:

  • Gdy sql_variant wartości różnych podstawowych typów danych są porównywane i typy danych podstawowych są w różnych danych typu rodzin, wartość, których rodziny typ danych jest wyżej w hierarchii jest uważana za wyższą z dwóch wartości.

  • Gdy sql_variant wartości różnych podstawowych typów danych są porównywane i typy danych podstawowych są w tej samej rodziny typu danych, wartość, której podstawowy typ danych jest niższa w hierarchii jest niejawnie konwertowane na typ danych i następnie dokonywania porównania.

  • Gdy sql_variant wartości char, varchar, nchar, lub varchar typy danych są porównywane, są oceniane na podstawie następujących kryteriów: Identyfikator LCID, wersja LCID, porównanie flagi i sortowaniaKażdy z tych kryteriów są porównywane jako wartości całkowite, a w określonej kolejności.

Zasady te mogą przynieść wyniki różnych porównań między sql_variant wartości niż porównanie wartości tego samego podstawowy typ danych.

Operand A

Operand B

Wynik porównania non-variant

wynik porównania sql_variant

'123' char

111 int

A > B

B > A

50000 int

5E1 float

A > B

B > A

Ponieważ wartości z danych innego typu rodzin musi jawnie oddanych przed odwołują się porównanie predykatów, podśmiertelne skutki reguł podczas zamawiania wynik określa tylko na sql_variant kolumna.Wartości w następującej tabela przedstawiono przykłady reguł dotyczących pierwszeństwo typu danych.

PriKey

VariantCol

1

50.0 (typ bazowy float)

2

5000 (typ bazowy int)

3

"124000" (typ bazowy char(6))

W poniższej tabela przedstawiono wyniki instrukcja: Wybierz * FROM VariantTest według kolejności VariantCol ASC.

PriKey

VariantCol

3

"124000" (typ bazowy char(6))

2

5000 (typ bazowy int)

1

50.0 (typ bazowy float)

Wartości w poniższej tabela przedstawiono przykłady reguł dotyczących pierwszeństwo sortowanie, który używa różnych ustawień sortowanie.

IntKey

VariantCol

1

qrs (varchar SQL_Latin1_General_Pref_Cp1_CI_AS)

2

ABC (varchar SQL_Latin1_General_Pref_Cp1_CI_AS)

3

qrs (varchar SQL_Latin1_General_CP1_CS_AS)

4

17,5 cala (dziesiętny)

5

ABC (varchar SQL_Latin1_General_CP1_CS_AS)

6

klm (varchar SQL_Latin1_General_CP1_CS_AS)

7

1,2 cala (dziesiętny)

W poniższej tabela przedstawiono wyniki instrukcja: Wybierz * FROM CollateTest według kolejności VariantCol.W poniższej tabela przedstawiono wartości z dokładną rodziny typu liczba danych zgrupowane, i varchar wartości są grupowane w ramach ich odpowiednich ustawień sortowania.

IntKey

VariantCol

5

ABC (varchar SQL_Latin1_General_CP1_CS_AS)

6

klm (varchar SQL_Latin1_General_CP1_CS_AS)

3

qrs (varchar SQL_Latin1_General_CP1_CS_AS)

2

ABC (varchar SQL_Latin1_General_Pref_Cp1_CI_AS)

1

qrs (varchar SQL_Latin1_General_Pref_Cp1_CI_AS)

7

1,2 cala (dziesiętny)

4

17,5 cala (dziesiętny)

Funkcje i dane typu sql_variant

Następujące Transact-SQL obsługuje funkcje sql_variant Parametry i zwrotu sql_variant wartość, gdy sql_variant jest określony parametr:

POŁĄCZENIE

MIN

MAX

NULLIF

Następujące funkcje obsługi odwołań do sql_variant kolumny lub zmiennych, a nie sql_variant jako typ danych zwracanej wartości:

COL_LENGTH

DŁUGOŚĆ_DANYCH

TYPEPROPERTY

COLUMNPROPERTY

FUNKCJA ISNULL

 

Następujące Transact-SQL nie obsługują funkcji sql_variant Parametry:

ŚREDNIA

RADIANY

FUNKCJA ODCH.STANDARDOWE [P]

TOŻSAMOŚĆ

ZAOKR

SUM

FUNKCJA ISNUMERIC

ZNAK

VAR [P]

ZASILANIA

 

 

Obsługują funkcje WYTOPU i konwertowanie sql_variant.

Nowa funkcja SQL_VARIANT_PROPERTY() można uzyskać właściwość informacji o sql_variant wartości, takie jak typ danych, precision lub skali.

Inne elementy języka Transact-SQL i sql_variant danych

sql_variant kolumny nie są obsługiwane w predykacie LIKE.

sql_variant columns are not supported in full-text indexes.sql_variant columns cannot be specified in full-text functions such as CONTAINSTABLE and FREETEXTTABLE.

Następujące Transact-SQL instrukcje obsługi, określanie sql_variant w tych samych lokalizacjach składni są określone przez innych typów danych integer:

  • ZMIENIANIE PROCEDURY

  • ALTER TABLE

  • TWORZENIE PROCEDURY

  • TWORZENIE TABELI

  • ZADEKLAROWAĆ variable

SQL Server Wykazu składników przekazywanie informacji o sql_variant kolumny.

Wynik wyrażenie CASE jest sql_variant Jeśli jednego z wyrażenie wprowadzania lub wynik oceny sql_variant.Podstawowy typ podstawowy wynik jest wyrażenie obliczane jako wynik przy uruchomieniu czas.

Argumenty liczbowe lub ciąg operatorów łączenie nie może być sql_variant.Na przykład poniższy kod generuje błąd:

SELECT VariantCol + @CharacterVar

FROM MyTable

Jednakże przez rzutowanie sql_variant operand, można wykonać operacji:

SELECT CAST(VariantCol AS varchar(25)) + @CharacterVar

FROM MyTable

Wnioski i dane typu sql_variant

Jeśli aplikacja żąda zestaw wyników, w którym zwraca kolumna określone sql_variant Typ danych bazy danych z pojedynczym podstawowej, aplikacji można użyć funkcji RZUTOWANIA lub konwersji w Transact-SQL instrukcji, aby zwrócić sql_variant danych przy użyciu odpowiedniego podstawowy typ danych.przypadek aplikacji traktuje dane, podobnie jak kolumna podstawowy typ danych podstawowy zestaw wyników.

SQL Server Macierzystego klienta OLE DB dostawca for SQL Server wprowadzono specyficznym dla dostawca OLE DB typu DBTYPE_SQLVARIANT do użytku z sql_variant kolumny i parametry.

The SQL Server SQL Server Native Client ODBC Driver introduces a provider-specific ODBC database data type SQL_SS_VARIANT for use with sql_variant columns and parameters.

SQL ServerKonwertuje sql_variant wartości do nvarchar(4000) podczas pracy z aplikacjami, które połączyły się za pomocą następujących interfejsów:

  • Dostawca OLE DB dla SQL Server w wersja 7.0.

  • SQL Server Ze sterownika ODBC SQL Server 7.0.

Jeśli wynikowy ciąg przekracza 4 000 znaków SQL Server zwraca pierwsze 4 000 znaków.

SQL ServerKonwertuje sql_variant wartości do varchar(255) podczas współpracuje z aplikacjami, które połączyły się za pomocą następujących interfejsów:

  • SQL Server Sterowniki ODBC z SQL Server w wersja 6.5 lub starszej.

Jeśli wynikowy ciąg przekracza 255 znaków SQL Server zwraca pierwsze 255 znaków.