pirmdiena, 2011. gada 19. septembris

SQL Server sql_variant datu tips

Viens ļoti interesants datu tips SQL Server ir sql_variant, kas var saglabāt dažādu datu tipu vērtības, patiesībā- jebkuras, kuru maksimālais garums ietilpst vienā datu lapā (8 KB).

MS SQL Server sql_variant ir pilnīgi legāls kolonas datu tips, tādēļ mēs varam izveidot šādu tabulu:
create table #t
(
    x sql_variant
)
Šāda tipa kolonnā, mēs varam glabāt praktiski jebkura datu tipa vērtību (ja šis datu tips ietilpst vienā datu lapā. Piemēram: nvarchar(4000) ir OK; nvarchar(max) nav OK; int ir OK; xml nav OK).
Tātad, šādā tabulā var ievietot visas šīs rindas:
Insert Into #t (x) values (cast('3' as CHAR(1)))
Insert Into #t (x) values (cast('3' as NCHAR(1)))
Insert Into #t (x) values (cast('3' as VarCHAR(3)))
Insert Into #t (x) values (cast('3' as NVarCHAR(3)))
Insert Into #t (x) values (cast(3 as int))
Insert Into #t (x) values (cast(3 as decimal(18,1)))
Insert Into #t (x) values (cast(3 as decimal(18,3)))
Insert Into #t (x) values (cast(3 as decimal(18,4)))
Insert Into #t (x) values (cast(3.00003 as decimal(18,5)))
Insert Into #t (x) values (GETDATE())
Insert Into #t (x) values (cast(Replicate('3',4000) as nchar(4000)))
Datus var arī izgūt (īpaši man patīk DateTime un tas, ka skaitļiem parāda pareizi zīmes aiz komata):
 
Tas tiek panākts tādējādi, ka kopā ar vērtību, tiek glabāts arī datu tips, kas kolonnā tika saglabāts (apskatīties vērtības var izmantojot SQL_VARIANT_PROPERTY funkciju):
 Select x,
    SQL_VARIANT_PROPERTY (x, 'BaseType') BaseType,
    SQL_VARIANT_PROPERTY (x, 'Precision') Precision,
    SQL_VARIANT_PROPERTY (x, 'Scale') Scale,
    SQL_VARIANT_PROPERTY (x, 'TotalBytes') TotalBytes
From #t
Iegūstam rezultātu:
 
Plašāk par sql_variant datu tipa lietošanu rakstīts msdn.

Tā jau datu tips interesants, bet neizskatās, ka varētu būt daudz labu iemeslu šo datu tipu lietot..

Nav komentāru:

Komentāra publicēšana