sql >> Databáze >  >> RDS >> Sqlserver

Priorita datových typů v SQL Server

Níže je uveden seznam obsahující datové typy serveru SQL Server v pořadí podle priority.

  1. uživatelsky definované datové typy (nejvyšší)
  2. sql_variant
  3. xml
  4. datetimeoffset
  5. datetime2
  6. datetime
  7. smalldatetime
  8. date
  9. time
  10. float
  11. real
  12. decimal
  13. money
  14. smallmoney
  15. bigint
  16. int
  17. smallint
  18. tinyint
  19. bit
  20. ntext
  21. text
  22. image
  23. timestamp
  24. uniqueidentifier
  25. nvarchar (včetně nvarchar(max) )
  26. nchar
  27. varchar (včetně varchar(max) )
  28. char
  29. varbinary (včetně varbinary(max) )
  30. binary (nejnižší)

Když použijete operátor ke kombinaci operandů různých datových typů, datový typ s nižší prioritou se nejprve převede na datový typ s vyšší prioritou.

Pokud převod není podporovaný implicitní převod, vrátí se chyba.

Pokud jsou oba operandy stejného typu, pak se neprovádí (ani není potřeba) žádná konverze a výsledek operace používá datový typ operandů.

Příklad

Zde je příklad úspěšné implicitní konverze:

SELECT 1 * 1.00;

Výsledek:

1.00

Zde byl levý operand převeden na datový typ pravého operandu.

Zde je explicitnější způsob, jak to udělat:

DECLARE 
    @n1 INT, 
    @n2 DECIMAL(5, 2);
SET @n1 = 1;
SET @n2 = 1;
SELECT @n1 * @n2;

Výsledek:

1.00

V tomto případě jsem levý operand explicitně deklaroval jako INT a pravý operand jako DECIMAL(5, 2) .

Výsledky můžeme dále zkoumat pomocí sys.dm_exec_describe_first_result_set funkce dynamického řízení systému.

Tato funkce nám umožňuje zkontrolovat datový typ každého sloupce vráceného v dotazu:

SELECT 
    system_type_name,
    max_length,
    [precision],
    scale
FROM sys.dm_exec_describe_first_result_set(
    'DECLARE @n1 INT, @n2 DECIMAL(5, 2);
SET @n1 = 1;
SET @n2 = 1;
SELECT @n1, @n2, @n1 * @n2;', 
    null, 
    0);

Výsledek:

+--------------------+--------------+-------------+---------+
| system_type_name   | max_length   | precision   | scale   |
|--------------------+--------------+-------------+---------|
| int                | 4            | 10          | 0       |
| decimal(5,2)       | 5            | 5           | 2       |
| decimal(16,2)      | 9            | 16          | 2       |
+--------------------+--------------+-------------+---------+

Zde vidíme, že každý řádek představuje každý sloupec vrácený dotazem. Proto byl první sloupec INT , druhý sloupec byl DECIMAL(5,2) a třetí sloupec DECIMAL(16,2) .

Takže SQL Server ve skutečnosti vrátil DECIMAL(16,2) , i když původní desetinná hodnota byla DECIMAL(5,2) .

Příklad chyby převodu

Jak již bylo zmíněno, pokud převod není podporovaný implicitní převod, vrátí se chyba:

SELECT 'Age: ' + 10;

Výsledek:

Msg 245, Level 16, State 1, Line 1
Conversion failed when converting the varchar value 'Age: ' to data type int.

V tomto případě jsem se snažil zřetězit řetězec (VARCHAR ) a číslo (INT ). Vidíte jako INT má vyšší prioritu než VARCHAR , SQL Server se pokusil implicitně převést řetězec na INT .

To se nezdařilo, protože tento řetězec nelze převést na celé číslo.

Abychom to překonali, můžeme nejprve převést INT na VARCHAR :

SELECT 'Age: ' + CAST(10 AS VARCHAR(2));

Výsledek:

Age: 10

Nyní mají oba operandy stejný datový typ, takže SQL Server provádí operaci úspěšně bez nutnosti provádět jakékoli implicitní převody.

Jiný způsob provedení této konkrétní operace je pomocí CONCAT() funkce:

SELECT CONCAT('Age: ', 10);

Výsledek:

Age: 10

CONCAT() funkce je řetězcová funkce, a proto implicitně převádí všechny argumenty na typy řetězců před zřetězením. Nebylo tedy nutné, abychom prováděli explicitní konverzi.

Pokud však lze operand řetězce implicitně převést na číslo, nezpůsobí to chybu při použití + operátor:

SELECT '10' + 10;

Výsledek:

20

Ale v tomto případě + operátor se změní na sčítací matematický operátor, spíše než na operátor zřetězení řetězců.


  1. PostgreSQL zástupný znak LIKE pro kterékoli ze seznamu slov

  2. Udržování seskupeného běhu MAX (nebo MIN)

  3. SQL Server Vysoká dostupnost:Nainstalujte SQL Server cluster s podporou převzetí služeb při selhání, část 2

  4. Minimalizace dopadu rozšíření sloupce IDENTITY – část 4