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.Na przykład jeden sql_variant kolumna może zawierać int, decimal, char, binary, a nchar wartości. Każde wystąpienie sql_variant Kolumna rejestruje wartości danych oraz informacji metadane. Obejmuje to podstawowy typ danych, maksymalny rozmiar, skalę, precyzję i sortowanie.

Reguły dotyczące używania sql_variant

Obowiązują następujące reguły do korzystania z sql_variant Typ danych.

Przypisywanie 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 dane 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ły, które odwołują się do sql_variant kolumny.

  • Jeśli sql_variant ma wartość NULL, nie wydaje się być podstawowym 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 ustawiona na NULL bez skojarzony jest typ danych, nawet jeśli wartość null pochodzi od int Zmienna:

    DECLARE @IntVar int

    SET @IntVar = NULL

    UPDATE SomeTable SET VariantCol = @IntVar WHERE PriKey = 123

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

  • W celu zachowania zgodności z innymi typami danych, obiekty katalogu, takie jak funkcja DŁUGOŚĆ_DANYCH, które raportują długości sql_variant obiekty raportują długość danych. Długość metadane, które są zawarte w sql_variant obiekt nie jest zwracany.

  • sql_variant kolumny zawsze pracować z ANSI_PADDING ON.Jeśli char, nchar, varchar, nvarchar, lub varbinary wartości są przypisywane ze urządzenie źródłowe, które ma ANSI_PADDING Wył, wartości nie są wypełniane.

  • Aktualizowanie subskrybent o jedną kolumna, prowadzi do zmiany typu podstawowego w innej kolumnie sql_variant.W poniższej procedurze pokazano pojęcie to:

    1. Tworzenie scalonej publikacja/subskrypcja.Opublikowane tabela powinien mieć kolumna sql_variant i kolumn c1.Dodać dane do kolumna sql_variant.Podstawowy typ danych jest datetime.

    2. Po wstępna synchronizacja typu podstawowego przez subskrybent, jest nadal datetime.

    3. Aktualizacja c1 kolumna przez subskrybent.

    4. Po zmianie danych kolumna sql_variant przez wydawcę na datetime2.

sql_variant w tabelach

  • sql_variant kolumny można użyć w indeksach i unikatowe klucze tak długo, jak długość danych w kolumnach kluczy nie jest większa niż 900 bajtów.

  • sql_variant kolumny nie obsługują właściwość IDENTITY, ale sql_variant kolumny można użyć jako część klucz podstawowy lub klucz obcy.

  • sql_variant kolumny nie mogą być używane kolumna obliczana.

  • Aby zmienić kolumna dowolnego typu danych, z wyjątkiem za pomocą instrukcji ALTER tabela text, ntext, image, timestamp, lub sql_variant Aby 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 instrukcję instrukcja ALTER tabela. ALTER tabela nie można zmienić typ danych sql_variant Kolumna do innych danych typ, ponieważ nie ma żadnych obsługiwanych konwersji niejawnych z sql_variant inne typy danych.

Collation

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

  • Jeśli wartość jest przypisany do sql_variant wystąpienie, wartość i podstawowy typ danych urządzenie źródłowe są przypisane. Jeśli urządzenie źródłowe wartość ma sortowania, sortowanie jest przypisany.Jeżeli urządzenie źródłowe ma typ danych zdefiniowany przez użytkownika, jest przypisany podstawowy typ danych typów danych zdefiniowanych przez użytkownika, wpisz nie danych zdefiniowanych przez użytkownika.The sql_variant wystąpienie does not inherit any rules or defaults bound to the user-defined data type. Jeśli wartość z kolumny z właściwość tożsamości jest przypisany do sql_variant wystąpienie, sql_variant podstawowy typ danych kolumna źródłowa pobiera, ale nie dziedziczy właściwości IDENTITY. Jest błędem przypisać text, ntext, lub image wartość do sql_variant wystąpienie. Podczas przypisywania wartości z obiektów, które mają inne dane typy do są obsługiwane konwersji niejawnych sql_variant obiekt.

sql_variant porównania

sql_variant kolumny mogą zawierać wartości kilku typów danych podstawowych i sortowania, dlatego specjalne zasady stosowane podczas porównywania sql_variant operandy. Zasady te dotyczą operacje, które są związane z porównań, takie jak:

  • Transact-SQL operatory porównania

  • SORTUJ WG, GRUPUJ WEDŁUG

  • Indeksy

  • MAX, MIN zagregowane funkcje

  • UNION (bez ALL)

  • Wyrażenia przypadek

Dla sql_variant polecenie SQL Server kolejność hierarchii typów danych są pogrupowane w rodzinach typu danych. The sql_variant family has the highest family precedence.

Typ danych hierarchii

Typ danych rodziny

sql_variant

sql_variant

datetime

Data i godzina

smalldatetime

Data i godzina

Float

Przybliżona numeryczne

Real

Przybliżona numeryczne

decimal

Dokładny numeryczny

money

Dokładny numeryczny

smallmoney

Dokładny numeryczny

bigint

Dokładny numeryczny

int

Dokładny numeryczny

smallint

Dokładny numeryczny

tinyint

Dokładny numeryczny

bit

Dokładny numeryczny

nvarchar

Unicode

nchar

Unicode

varchar

Unicode

char

Unicode

varbinary

Binary

binary

Binary

uniqueidentifier

Uniqueidentifier

Te zasady dotyczą sql_variant porównania:

  • Kiedy sql_variant wartości typów różne dane podstawowe są porównywane oraz typy danych podstawowych znajdują się w różnych rodzin typu, wartość, której typ danych, systemów z rodziny jest wyższy w hierarchii wykresu zostanie uznana za większej z dwóch wartości.

  • Kiedy sql_variant wartości typów różne dane podstawowe są porównywane i typy danych podstawowych są w tej samej rodziny typu danych, wartość, której podstawowy typ danych jest niższa na wykresie hierarchii jest niejawnie konwertowane na inny typ danych i porównanie jest przeprowadzane.

  • Kiedy sql_variant wartości char, varchar, nchar, lub varchar typy danych są porównywane, są one obliczane na podstawie następujących kryteriów: Identyfikator LCID, wersja LCID, flagi porównania i sortować nazwy. Każdy z tych kryteriów są porównywane jako wartości całkowite, a w podanej kolejności.

Reguły te mogą spowodować różne wyniki dla porównania między sql_variant Wpisz wartości niż porównanie wartości tych samych danych podstawowych.

Operand A

Operand B

Wynik porównania nie wariantu

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 różnych rodzin typu musi jawnie rzutować przed, której dotyczy odwołanie w predykaty porównania, efekty reguł obserwuje się podczas porządkowania wynik określa tylko na sql_variant Kolumna. W poniższej tabela są przykładami zasad dotyczących danych typu pierwszeństwo.

PriKey

VariantCol

1

Typ podstawowy (50.0 float)

2

Typ podstawowy (5000 int)

3

"124000' (typ podstawowy char(6))

W poniższej tabela przedstawiono wyniki instrukcja: SELECT * FROM VariantTest SORTUJ WG VariantCol ASC.

PriKey

VariantCol

3

"124000' (typ podstawowy char(6))

2

Typ podstawowy (5000 int)

1

Typ podstawowy (50.0 float)

Wartości w tabela poniżej przedstawiono przykłady zasad dotyczących priorytet sortowanie, których zastosowano różne ustawienia 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

szerokość (dziesiętny)

5

ABC (varchar SQL_Latin1_General_CP1_CS_AS)

6

klm (varchar SQL_Latin1_General_CP1_CS_AS)

7

1.2 (decimal)

W poniższej tabela przedstawiono wyniki instrukcja: SELECT * FROM CollateTest SORTUJ WG VariantCol. W poniższej tabela pokazano wartości z dokładnie rodziny typu liczby danych, grupowane, a 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 (decimal)

4

szerokość (dziesiętny)

Funkcje i sql_variant danych

Poniżej Transact-SQL Obsługa funkcji sql_variant Parametry i powrotu sql_variant Kiedy wartość sql_variant parametr jest określony:

sp_help_jobschedule

MIN

MAX

NULLIF

Następujące funkcje obsługi odwołań do sql_variant kolumny lub zmienne i nie należy używać sql_variant jako typ danych zwracanej wartości:

COL_LENGTH

sp_add_operator

TYPEPROPERTY

COLUMNPROPERTY

ISNULL

 

Poniżej Transact-SQL funkcje nie są obsługiwane. sql_variant Parametry:

ŚREDNIA

RADIANY

ODCH.STANDARDOWE [P]

TOŻSAMOŚĆ

ZAOKR

SUM

ISNUMERIC

ZNAK

VAR [P]

ZASILANIA

 

 

Obsługa funkcji CAST i CONVERT sql_variant.

Nowa funkcja SQL_VARIANT_PROPERTY() może służyć do uzyskiwania informacji o właściwościach — informacje sql_variant wartości, takie jak typ danych, precyzji i 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.

Poniżej Transact-SQL instrukcje obsługi, określanie sql_variant w tej samej lokalizacji składni określane są to dane typu integer:

  • ZMIENIANIE PROCEDURY

  • ALTER tabela

  • TWORZENIE PROCEDURY

  • TWORZENIE tabela

  • ZADEKLAROWAĆ variable

The SQL Server catalog components report information about sql_variant columns.

przypadek wynikiem wyrażenie przypadek sql_variant Jeśli jeden z wejściem lub wynik wyrażenie mają sql_variant. Podstawowy typ bazowy wyników jest wyrażenie obliczane w wyniku w czasie wykonywania.

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

SELECT VariantCol + @CharacterVar

FROM MyTable

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

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

FROM MyTable

Aplikacje i sql_variant danych

Jeśli aplikacja żąda zestaw wyników, w których zwraca wartość danej kolumna sql_variant Typ danych bazy danych z jednego podstawowej, aplikacja może używać funkcji CAST lub CONVERT w Transact-SQL instrukcje, aby przywrócić sql_variant dane przy użyciu podstawowych utworzyć typ danych. W tym przypadek aplikacja traktuje dane, tak samo, jak kolumna podstawowy typ danych podstawowy zestaw wyników.

The SQL Server Native klient OLE DB dostawca for SQL Server introduces a dostawca-specific OLE DB type DBTYPE_SQLVARIANT for use with sql_variant columns and parameters.

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 Server Konwertuje sql_variant wartości 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.

  • The SQL Server ODBC Driver from SQL Server 7.0.

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

SQL Server Konwertuje sql_variant wartości varchar(255) Kiedy działa z aplikacjami, które połączyły się za pomocą następujących interfejsów:

  • The SQL Server ODBC Drivers from SQL Server wersja 6.5 or earlier.

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