Udostępnij za pośrednictwem


RZUTOWANIE i konwertowanie (Transact-SQL)

Dotyczy:programu SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)punkt końcowy analizy SQL w usłudze Microsoft FabricMagazyn w usłudze Microsoft Fabric

Te funkcje konwertują wyrażenie jednego typu danych na inny.

Składnia

CAST składnia:

CAST ( expression AS data_type [ ( length ) ] )

CONVERT składnia:

CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

Transact-SQL konwencje składni

Argumenty (w programowaniu)

wyrażenie

Dowolne prawidłowe wyrażenie.

data_type

Docelowy typ danych. Obejmuje to pliki XML, bigint i sql_variant. Nie można używać typów danych aliasu.

długości

Opcjonalna liczba całkowita określająca długość docelowego typu danych dla typów danych, które zezwalają użytkownikowi na określoną długość. Wartość domyślna to 30.

styl

Wyrażenie całkowite określające sposób CONVERT tłumaczenia wyrażenia przez funkcję. W przypadku wartości stylu NULL zwracana jest wartość NULL. data_type określa zakres.

Typy zwracane

Zwraca wyrażenie przetłumaczone na data_type.

Style daty i godziny

W przypadku wyrażenia typu danych daty lub godziny styl może mieć jedną z wartości przedstawionych w poniższej tabeli. Inne wartości są przetwarzane jako 0. Począwszy od programu SQL Server 2012 (11.x), jedynymi obsługiwanymi stylami podczas konwertowania typów daty i godziny na wartość datetimeoffset jest 0 lub 1. Wszystkie inne style konwersji zwracają błąd 9809.

Uwaga / Notatka

Program SQL Server obsługuje format daty w stylu arabskim z algorytmem Kuwejtu.

Bez wieku (yy) 1 Z stuleciem (yyyy) Standardowy Wejście/wyjście 3
- 0 lub 1001,2 Ustawienie domyślne dla daty/godziny i smalldatetime mon dd yyyy hh:miAM (lub PM)
1 101 USA 1 = mm/dd/yy
101 = mm/dd/yyyy
2 102 ANSI (Amerykański Narodowy Instytut Normalizacyjny) 2 = yy.mm.dd
102 = yyyy.mm.dd
3 103 Brytyjski/francuski 3 = dd/mm/yy
103 = dd/mm/yyyy
4 104 Niemiecki 4 = dd.mm.yy
104 = dd.mm.yyyy
5 105 Włoski 5 = dd-mm-yy
105 = dd-mm-yyyy
6 1061 - 6 = dd mon yy
106 = dd mon yyyy
7 1071 - 7 = Mon dd, yy
107 = Mon dd, yyyy
8 lub 24 108 - hh:mi:ss
- 9 lub 1091,2 Domyślne + milisekundy mon dd yyyy hh:mi:ss:mmmAM (lub PM)
10 110 USA 10 = mm-dd-yyy
110 = mm-dd-yyyy
11 111 JAPONIA 11 = rr/mm/dd
111 = yyyy/mm/dd
12 112 ISO 12 = yymmdd
112 = yyyymmdd
- 13 lub 1131,2 Europa domyślna + milisekundy dd mon yyyy hh:mi:ss:mmm (24 godziny)
14 114 - hh:mi:ss:mmm (24 godziny)
- 20 lub 1202 Kanoniczny ODBC yyyy-mm-dd hh:mi:ss (24 godziny)
- 21 lub 25 lub 1212 Wartość domyślna kanoniczna ODBC (z milisekundami) dla wartości time, date, datetime2 i datetimeoffset yyyy-mm-dd hh:mi:ss.mmm (24 godziny)
22 - USA mm/dd/yy hh:mi:ss AM (lub PM)
- 23 ISO8601 yyyy-mm-dd
- 1264 ISO8601 yyyy-mm-ddThh:mi:ss.mmm (bez spacji) 6
- 1278, 9 ISO8601 ze strefą czasową Z yyyy-MM-ddThh:mm:ss.fffZ (bez spacji) 6
- 1301,2 Hidżri 5 dd mon yyyy hh:mi:ss:mmmAM 7
- 1312 Hidżri 5 dd/mm/yyyy hh:mi:ss:mmmAM

1 Te wartości stylu zwracają niedeterministyczne wyniki. Obejmuje wszystkie () (yybez wieku) style i podzbiór stylów () (yyyyz stuleciem).

2 Wartości domyślne (0 lub 100, 9 lub 109, 13 lub 113, 20 lub 120, 23 i 21 lub 25 lub 121) zawsze zwracają wiek (yyyy).

Ważne

Domyślnie program SQL Server interpretuje dwa cyfry lat na podstawie roku odcięcia z 2049 roku. Oznacza to, że program SQL Server interpretuje dwucyfrowy rok 49 jako 2049 i dwucyfrowy rok 50 jako 1950. Wiele aplikacji klienckich, w tym tych opartych na obiektach automatyzacji, używa roku odcięcia z 2030 roku. Program SQL Server udostępnia dwucyfrową opcję konfiguracji odcięcia roku, aby zmienić rok odcięcia używany przez program SQL Server. Pozwala to na spójne traktowanie dat. Zalecamy określenie czterocyfrowych lat.

3 Dane wejściowe podczas konwertowania na datę/godzinę; dane wyjściowe podczas konwertowania na dane znaków.

4 Przeznaczone do użytku XML. Aby uzyskać konwersję z daty/godziny lub smalldatetime na dane znaków, zobacz poprzednią tabelę dla formatu danych wyjściowych.

5 Hidżri to system kalendarza z kilkoma odmianami. Program SQL Server używa algorytmu Kuwejtu.

6 W przypadku wartości milisekund (mmm) 0 nie będzie wyświetlana wartość ułamkowa milisekundowa. Na przykład wartość 2022-11-07T18:26:20.000 jest wyświetlana jako 2022-11-07T18:26:20.

7 W tym stylu mon reprezentuje wielo token Hidżri Unicode reprezentację pełnej nazwy miesiąca. Ta wartość nie jest poprawnie renderowana w domyślnej instalacji programu SSMS w STANACH Zjednoczonych.

8 Obsługiwane tylko podczas rzutowania danych znaków do daty/godziny lub smalldatetime. Podczas rzutowania danych znaków reprezentujących tylko składniki daty lub godziny tylko do typów danych datetime lub smalldatetime nieokreślony składnik godziny jest ustawiony na 00:00:00.000, a nieokreślony składnik daty jest ustawiony na 1900-01-01wartość .

9 Użyj opcjonalnego wskaźnika Z strefy czasowej, aby ułatwić mapowania wartości daty/godziny XML, które mają informacje o strefie czasowej do wartości daty/godziny programu SQL Server, które nie mają strefy czasowej. Z wskazuje strefę czasową o godzinie UTC-0. Przesunięcie HH:MM w + kierunku lub - wskazuje inne strefy czasowe. Na przykład: 2022-12-12T23:45:12-08:00.

Podczas konwertowania parametru smalldatetime na dane znaków style zawierające sekundy lub milisekundy pokazują zera w tych pozycjach. Podczas konwertowania wartości datetime lub smalldatetime należy użyć odpowiedniej długości danych char lub varchar , aby obciąć niepożądane części daty.

Podczas konwertowania danych znaków na wartość datetimeoffset przy użyciu stylu zawierającego czas przesunięcie strefy czasowej jest dołączane do wyniku.

style zmiennoprzecinkowe i rzeczywiste

W przypadku wyrażeniazmiennoprzecinkowego lub rzeczywistegostyl może mieć jedną z wartości pokazanych w poniższej tabeli. Inne wartości są przetwarzane jako 0.

Wartość Wynik
0 (wartość domyślna) Maksymalnie 6 cyfr. Używaj w notacji naukowej, jeśli jest to konieczne.
1 Zawsze 8 cyfr. Zawsze używaj w notacji naukowej.
2 Zawsze 16 cyfr. Zawsze używaj w notacji naukowej.
3 Zawsze 17 cyfr. Służy do konwersji bezstratnej. W tym stylu każda unikatowa wartość zmiennoprzecinkowa lub rzeczywista ma gwarancję konwersji na odrębny ciąg znaków.

Dotyczy: SQL Server 2016 (13.x) i nowsze wersje oraz Azure SQL Database.
126, 128, 129 Uwzględnione ze starszych powodów. Nie używaj tych wartości do tworzenia nowych rozwiązań.

pieniądze i małe style

W przypadku wyrażeniamoney lub smallmoneystyl może mieć jedną z wartości przedstawionych w poniższej tabeli. Inne wartości są przetwarzane jako 0.

Wartość Wynik
0 (wartość domyślna) Brak przecinków co trzy cyfry z lewej strony przecinka dziesiętnego i dwóch cyfr z prawej strony punktu dziesiętnego

Przykład: 4235.98.
1 Przecinki co trzy cyfry z lewej strony przecinka dziesiętnego i dwie cyfry z prawej strony punktu dziesiętnego

Przykład: 3510.92.
2 Brak przecinków co trzy cyfry po lewej stronie przecinka dziesiętnego i czterech cyfr z prawej strony punktu dziesiętnego

Przykład: 4235.9819.
126 Odpowiednik stylu 2 podczas konwertowania na char(n) lub varchar(n)

style xml

W przypadku wyrażeniaXMLstyl może mieć jedną z wartości pokazanych w poniższej tabeli. Inne wartości są przetwarzane jako 0.

Wartość Wynik
0 (wartość domyślna) Użyj domyślnego zachowania analizowania, które odrzuca nieistotne białe znaki i nie zezwala na wewnętrzny podzbiór DTD.

Nuta: Podczas konwertowania na typ danych XML program SQL Server nieistotne odstępy są obsługiwane inaczej niż w formacie XML 1.0. Aby uzyskać więcej informacji, zobacz Tworzenie wystąpień danych XML.
1 Zachowaj nieistotne odstępy. To ustawienie stylu ustawia domyślną xml:space obsługę tak, aby odpowiadała zachowaniu elementu xml:space="preserve".
2 Włącz ograniczone wewnętrzne przetwarzanie podzestawu DTD.

Jeśli jest włączona, serwer może użyć następujących informacji podanych w wewnętrznym podzestawie DTD, aby wykonać niewalidujące operacje analizy.

- Stosowane są wartości domyślne atrybutów
— Odwołania do jednostek wewnętrznych są rozwiązywane i rozszerzane
— Model zawartości DTD jest sprawdzany pod kątem poprawności składniowej

Analizator ignoruje zewnętrzne podzestawy DTD. Ponadto nie ocenia deklaracji XML, aby sprawdzić, czy atrybut autonomiczny ma wartość tak , czy nie . Zamiast tego analizuje wystąpienie XML jako samodzielny dokument.
3 Zachowaj nieistotne odstępy i włącz ograniczone wewnętrzne przetwarzanie podzestawu DTD.

Style binarne

W przypadku wyrażenia binary(n), char(n), varbinary(n)lub varchar(n), styl może mieć jedną z wartości pokazanych w poniższej tabeli. Wartości stylów, które nie są wymienione w tabeli, zwracają błąd.

Wartość Wynik
0 (wartość domyślna) Tłumaczy znaki ASCII na bajty binarne lub bajty binarne na znaki ASCII. Każdy znak lub bajt jest konwertowany na wartość 1:1.

W przypadku data_type binarnego znaki 0x są dodawane po lewej stronie wyniku.
1, 2 W przypadku data_type binarnego wyrażenie musi być wyrażeniem znaku. Wyrażenie musi mieć parzystą liczbę cyfr szesnastkowej (0, 1, 2, 3, 4, 5, 6, 7, 8, A, B, C, D, E, F, b, c, d, e, f). Jeśli styl jest ustawiony na 1, wyrażenie musi mieć 0x jako pierwsze dwa znaki. Jeśli wyrażenie zawiera nieparzystą liczbę znaków lub jeśli którykolwiek z znaków jest nieprawidłowy, zostanie zgłoszony błąd.

Jeśli długość przekonwertowanego wyrażenia przekracza długość data_type, wynik jest obcinany prawidłowo.

Stała długość data_typewiększy niż przekonwertowany wynik zawiera zera dodane z prawej strony wyniku.

Data_type znaku typu wymaga wyrażenia binarnego. Każdy znak binarny jest konwertowany na dwa znaki szesnastkowe. Załóżmy, że długość przekonwertowanego wyrażenia przekracza długość data_type. W takim przypadku jest obcięty.

W przypadku typu znaku o stałym rozmiarze data_type, jeśli długość przekonwertowanego wyniku jest mniejsza niż jego długość data_type, spacje są dodawane po prawej stronie przekonwertowanego wyrażenia, aby zachować parzystą liczbę cyfr szesnastkowe.

Znaki 0x nie są dodawane po lewej stronie przekonwertowanego wyniku dla stylu 2.

Niejawne przekształcenia

Konwersje niejawne nie wymagają specyfikacji CAST funkcji ani CONVERT funkcji. Konwersje jawne wymagają specyfikacji CAST funkcji lub CONVERT funkcji. Poniższa ilustracja przedstawia wszystkie jawne i niejawne konwersje typów danych dozwolone dla typów danych dostarczonych przez system programu SQL Server. Należą do nich bigint i sql_variant i xml. Nie ma niejawnej konwersji przy przypisaniu z typu danych sql_variant , ale istnieje niejawna konwersja na sql_variant.

Wskazówka

Centrum pobierania Microsoft ma ten wykres dostępny do pobrania jako plik PNG.

Diagram przedstawiający tabelę możliwych konwersji typów danych.

Powyższy wykres ilustruje wszystkie jawne i niejawne konwersje dozwolone w programie SQL Server, ale wynikowy typ danych konwersji zależy od wykonywanej operacji:

  • W przypadku jawnych konwersji sama instrukcja określa wynikowy typ danych.
  • W przypadku niejawnych konwersji instrukcje przypisania, takie jak ustawienie wartości zmiennej lub wstawienie wartości w kolumnie spowoduje typ danych zdefiniowany przez deklarację zmiennej lub definicję kolumny.
  • W przypadku operatorów porównania lub innych wyrażeń wynikowy typ danych będzie zależeć od reguł pierwszeństwa typu danych.

Wskazówka

Praktyczny przykład wpływu pierwszeństwa typu danych w konwersjach można zobaczyć w dalszej części tej sekcji.

Podczas konwertowania między wartością datetimeoffset a typami znaków char, nchar, nvarchar i varchar przekonwertowana część przesunięcia strefy czasowej powinna zawsze zawierać podwójne cyfry dla obu elementów i HH. MM Na przykład -08:00.

Ponieważ dane Unicode zawsze używają parzystej liczby bajtów, należy zachować ostrożność podczas konwertowania typów danych binarnych lub varbinary na lub z obsługiwanych typów danych Unicode. Na przykład poniższa konwersja nie zwraca wartości szesnastkowej 41. Zwraca wartość szesnastkowa 4100:

SELECT CAST(CAST(0x41 AS nvarchar) AS varbinary);

Aby uzyskać więcej informacji, zobacz Sortowanie i obsługa Unicode.

Typy danych o dużej wartości

Typy danych o dużej wartości mają takie samo niejawne i jawne zachowanie konwersji co ich mniejsze odpowiedniki — w szczególności typy danych nvarchar, varbinary i varchar . Należy jednak wziąć pod uwagę następujące wytyczne:

  • Konwersja z obrazu na varbinary(max)i odwrotnie, działa jako niejawna konwersja, podobnie jak konwersje między tekstem a varchar(max), a ntext i nvarchar(max).
  • Konwersja z typów danych o dużej wartości, takich jak varchar(max), do mniejszego typu danych odpowiednika, takiego jak varchar, jest niejawną konwersją, ale obcinanie występuje, jeśli rozmiar dużej wartości przekracza określoną długość mniejszego typu danych.
  • Konwersja z nvarchar, varbinary lub varchar na odpowiadające im typy danych o dużej wartości odbywa się niejawnie.
  • Konwersja z typu danych sql_variant na typy danych o dużej wartości jest jawną konwersją.
  • Nie można przekonwertować typów danych o dużej wartości na typ danych sql_variant .

Aby uzyskać więcej informacji na temat konwersji z typu danych XML , zobacz Create Instances of XML Data (Tworzenie wystąpień danych XML).

Typ danych xml

W przypadku jawnego lub niejawnego rzutowania typu danych XML na ciąg lub binarny typ danych zawartość typu danych XML jest serializowana na podstawie zdefiniowanego zestawu reguł. Aby uzyskać informacje o tych regułach, zobacz Definiowanie serializacji danych XML. Aby uzyskać informacje o konwersji z innych typów danych na typ danych XML , zobacz Create Instances of XML Data (Tworzenie wystąpień danych XML).

typy danych tekstowych i obrazów

Typy danych tekstu i obrazu nie obsługują automatycznej konwersji typów danych. Możesz jawnie przekonwertować dane tekstowe na dane znaków, a dane obrazu na binarne lub varbinary, ale maksymalna długość to 8000 bajtów. Jeśli spróbujesz wykonać nieprawidłową konwersję, na przykład próbujesz przekonwertować wyrażenie znaku zawierające litery na int, program SQL Server zwróci komunikat o błędzie.

Sortowanie danych wyjściowych

CAST Gdy funkcje lub CONVERT wyprowadźą ciąg znaków i otrzymają dane wejściowe ciągu znaku, dane wyjściowe mają taką samą etykietę sortowania i sortowania, jak dane wejściowe. Jeśli dane wejściowe nie są ciągiem znaków, dane wyjściowe mają domyślne sortowanie bazy danych i etykietę sortowania wartości coercible-default. Aby uzyskać więcej informacji, zobacz Sortowanie pierwszeństwo (Transact-SQL).

Aby przypisać inne sortowanie do danych wyjściowych, zastosuj klauzulę COLLATE do wyrażenia CAST wyniku funkcji or CONVERT . Przykład:

SELECT CAST('abc' AS varchar(5)) COLLATE French_CS_AS;

Obcinanie i zaokrąglanie wyników

Podczas konwertowania wyrażeń znaków lub binarnych (binarnych, char, nchar, nvarchar, varbinary lub varchar) na wyrażenie innego typu danych operacja konwersji może obcinać dane wyjściowe, tylko częściowo wyświetlać dane wyjściowe lub zwracać błąd. Te przypadki wystąpią, jeśli wynik jest zbyt krótki, aby wyświetlić. Konwersje na binarne, char, nchar, nvarchar, varbinary lub varchar są obcinane, z wyjątkiem konwersji pokazanych w poniższej tabeli.

Z typu danych Do typu danych Wynik
int, smallint lub tinyint Char
varchar
Zbyt krótki, aby wyświetlić
nchar
nvarchar
Błąd 1
pieniądze, małamoney, liczbowa, dziesiętna, zmiennoprzecinkowa lub rzeczywista Char
varchar
Błąd 1
nchar
nvarchar
Błąd 1

1 Zwrócony błąd, ponieważ długość wyniku jest zbyt krótka, aby wyświetlić.

Program SQL Server gwarantuje, że tylko konwersje dwukierunkowe, innymi słowy konwersje, które konwertują typ danych z oryginalnego typu danych i z powrotem, dają te same wartości z wersji na wersję. W poniższym przykładzie pokazano taką konwersję dwukierunkową:

DECLARE @myval DECIMAL(5, 2);
SET @myval = 193.57;

SELECT CAST(CAST(@myval AS VARBINARY(20)) AS DECIMAL(10, 5));

-- Or, using CONVERT
SELECT CONVERT(DECIMAL(10, 5), CONVERT(VARBINARY(20), @myval));
GO

Ostrzeżenie

Nie konstruuj wartości binarnych , a następnie konwertuj je na typ danych kategorii typu danych liczbowych. Program SQL Server nie gwarantuje, że wynik konwersji typu danych dziesiętnych lub liczbowych na binarny będzie taki sam między wersjami programu SQL Server.

W poniższym przykładzie pokazano wynikowe wyrażenie, które jest zbyt małe do wyświetlenia.

USE AdventureWorks2022;
GO

SELECT p.FirstName,
    p.LastName,
    SUBSTRING(p.Title, 1, 25) AS Title,
    CAST(e.SickLeaveHours AS CHAR(1)) AS [Sick Leave]
FROM HumanResources.Employee e
INNER JOIN Person.Person p
    ON e.BusinessEntityID = p.BusinessEntityID
WHERE NOT e.BusinessEntityID > 5;
GO

Oto zestaw wyników.

FirstName   LastName      Title   Sick Leave
---------   ------------- ------- --------`
Ken         Sanchez       NULL   *
Terri       Duffy         NULL   *
Roberto     Tamburello    NULL   *
Rob         Walters       NULL   *
Gail        Erickson      Ms.    *

(5 row(s) affected)

Podczas konwertowania typów danych, które różnią się miejscami dziesiętnym, program SQL Server czasami zwraca obciętą wartość wyniku, a w innych przypadkach zwróci zaokrągloną wartość. W tej tabeli przedstawiono zachowanie.

Źródło Do Zachowanie
numeryczny numeryczny Okrągły
numeryczny Int Skracać
numeryczny pieniędzy Okrągły
pieniędzy Int Okrągły
pieniędzy numeryczny Okrągły
spławik Int Skracać
spławik numeryczny Runda 1
spławik data/godzina Okrągły
data/godzina Int Okrągły

1 Konwersja wartości zmiennoprzecinkowych , które używają notacji naukowej do liczby dziesiętnej lub liczbowej , jest ograniczona tylko do wartości precyzji 17 cyfr. Dowolna wartość o precyzji wyższej niż 17 zaokrągleń do zera.

Na przykład wartości 10.6496 i -10.6496 mogą być obcinane lub zaokrąglane podczas konwersji na typy int lub liczbowe :

SELECT CAST(10.6496 AS INT) AS trunc1,
       CAST(-10.6496 AS INT) AS trunc2,
       CAST(10.6496 AS NUMERIC) AS round1,
       CAST(-10.6496 AS NUMERIC) AS round2;

Wyniki zapytania są wyświetlane w poniższej tabeli:

obcinanie1 obcinanie2 runda 1 round2
10 -10 11 -11

Podczas konwertowania typów danych, w których docelowy typ danych ma mniej miejsc dziesiętnych niż typ danych źródłowych, wartość jest zaokrąglona. Na przykład ta konwersja zwraca wartość $10.3497:

SELECT CAST(10.3496847 AS money);

Program SQL Server zwraca komunikat o błędzie podczas konwertowania nieliczbowego znaku, nchar, nvarchar lub varchar danych na dane dziesiętne, float, int, numeryczne. Program SQL Server zwraca również błąd, gdy pusty ciąg (" ") jest konwertowany na liczbowe lub dziesiętne.

Niektóre konwersje daty/godziny są niedeterministyczne

Style, dla których konwersja typu ciąg-data/godzina jest nieokreślona, są następujące:

  • Wszystkie style poniżej 100 1
  • 106
  • 107
  • 109
  • 113
  • 130

1 Z wyjątkiem stylów 20 i 21

Aby uzyskać więcej informacji, zobacz Niedeterministyczna konwersja ciągów dat literału na wartości DATE.

Znaki dodatkowe (pary zastępcze)

Począwszy od programu SQL Server 2012 (11.x), w przypadku używania sortowania CAST dodatkowego (SC), operacja z nchar lub nvarchar do typu nchar lub nvarchar o mniejszej długości nie obcina się wewnątrz pary zastępczej. Zamiast tego operacja obcina się przed znakiem dodatkowym. Na przykład poniższy fragment kodu pozostawia @x tylko 'ab'element . Za mało miejsca do przechowywania dodatkowego znaku.

DECLARE @x NVARCHAR(10) = 'ab' + NCHAR(0x10000);

SELECT CAST(@x AS NVARCHAR(3));

W przypadku korzystania z sortowania SC zachowanie klasy CONVERTjest podobne do tego z klasy CAST. Aby uzyskać więcej informacji, zobacz Obsługa sortowania i unicode — znaki dodatkowe.

Obsługa zgodności

We wcześniejszych wersjach programu SQL Server domyślny styl operacji i dla CAST typów danych CONVERT i datetime2 wynosi 121, z wyjątkiem sytuacji, gdy w wyrażeniu kolumny obliczeniowej jest używany dowolny typ. W przypadku kolumn obliczanych domyślny styl to 0. To zachowanie ma wpływ na obliczone kolumny podczas ich tworzenia, używane w zapytaniach obejmujących autoparametryzację lub używane w definicjach ograniczeń.

W przypadku poziomu zgodności 110 i nowszych CASTCONVERT typy danych i i i w typach danych data/godzina2 zawsze mają 121 jako domyślny styl. Jeśli zapytanie opiera się na starym zachowaniu, użyj poziomu zgodności mniejszego niż 110 lub jawnie określ styl 0 w zapytaniu, którego dotyczy problem.

Wartość poziomu zgodności Domyślny styl dla CAST i CONVERT1 Domyślny styl kolumny obliczeniowej
< 110 121 0
> = 110 121 121

1 Z wyjątkiem kolumn obliczeniowych

Uaktualnienie bazy danych do poziomu zgodności 110 i nowszych nie spowoduje zmiany danych użytkownika przechowywanych na dysku. Należy ręcznie poprawić te dane zgodnie z potrzebami. Jeśli na przykład użyto funkcji SELECT INTO do utworzenia tabeli ze źródła zawierającego obliczone wyrażenie kolumny opisane powyżej, dane (korzystające ze stylu 0) będą przechowywane zamiast samej definicji obliczonej kolumny. Musisz ręcznie zaktualizować te dane, aby dopasować styl 121.

Przykłady

Odp. Używanie funkcji RZUTOWANIE i KONWERTOWANIE

Te przykłady pobierają nazwę produktu, dla tych produktów, które mają jako pierwszą 3 cyfrę ceny katalogowej, i konwertuje ich ListPrice wartości na int.

Można używać serwera CAST:

USE AdventureWorks2022;
GO

SELECT SUBSTRING(Name, 1, 30) AS ProductName,
    ListPrice
FROM Production.Product
WHERE CAST(ListPrice AS INT) LIKE '33%';
GO

Można używać serwera CONVERT:

USE AdventureWorks2022;
GO

SELECT SUBSTRING(Name, 1, 30) AS ProductName,
    ListPrice
FROM Production.Product
WHERE CONVERT(INT, ListPrice) LIKE '33%';
GO

Oto zestaw wyników. Przykładowy zestaw wyników jest taki sam dla obu CAST elementów i CONVERT.

ProductName                    ListPrice
------------------------------ ---------------------
LL Road Frame - Black, 58      337.22
LL Road Frame - Black, 60      337.22
LL Road Frame - Black, 62      337.22
LL Road Frame - Red, 44        337.22
LL Road Frame - Red, 48        337.22
LL Road Frame - Red, 52        337.22
LL Road Frame - Red, 58        337.22
LL Road Frame - Red, 60        337.22
LL Road Frame - Red, 62        337.22
LL Road Frame - Black, 44      337.22
LL Road Frame - Black, 48      337.22
LL Road Frame - Black, 52      337.22
Mountain-100 Black, 38         3374.99
Mountain-100 Black, 42         3374.99
Mountain-100 Black, 44         3374.99
Mountain-100 Black, 48         3374.99
HL Road Front Wheel            330.06
LL Touring Frame - Yellow, 62  333.42
LL Touring Frame - Blue, 50    333.42
LL Touring Frame - Blue, 54    333.42
LL Touring Frame - Blue, 58    333.42
LL Touring Frame - Blue, 62    333.42
LL Touring Frame - Yellow, 44  333.42
LL Touring Frame - Yellow, 50  333.42
LL Touring Frame - Yellow, 54  333.42
LL Touring Frame - Yellow, 58  333.42
LL Touring Frame - Blue, 44    333.42
HL Road Tire                   32.60

(28 rows affected)

B. Używanie funkcji CAST z operatorami arytmetycznymi

W tym przykładzie obliczane jest obliczenie pojedynczej kolumny (Computed) przez podzielenie całkowitej sprzedaży z roku na datę (SalesYTD) według wartości procentowej prowizji (CommissionPCT). Ta wartość jest zaokrąglona do najbliższej liczby całkowitej, a następnie CAST do typu danych int .

USE AdventureWorks2022;
GO

SELECT CAST(ROUND(SalesYTD / CommissionPCT, 0) AS INT) AS Computed
FROM Sales.SalesPerson
WHERE CommissionPCT != 0;
GO

Oto zestaw wyników.

Computed
------
379753754
346698349
257144242
176493899
281101272
0
301872549
212623750
298948202
250784119
239246890
101664220
124511336
97688107

(14 row(s) affected)

C. Łączenie za pomocą funkcji CAST

W tym przykładzie są łączone wyrażenia noncharacter przy użyciu polecenia CAST. Używa AdventureWorksDW2022 ona bazy danych.

SELECT 'The list price is ' + CAST(ListPrice AS VARCHAR(12)) AS ListPrice
FROM dbo.DimProduct
WHERE ListPrice BETWEEN 350.00 AND 400.00;

Oto zestaw wyników.

ListPrice
------------------------
The list price is 357.06
The list price is 364.09
The list price is 364.09
The list price is 364.09
The list price is 364.09

D. Używanie funkcji CAST do tworzenia bardziej czytelnego tekstu

W tym przykładzie użyto CAST na liście SELECT, aby przekonwertować kolumnę Name na kolumnę char(10). Używa AdventureWorksDW2022 ona bazy danych.

SELECT DISTINCT CAST(EnglishProductName AS CHAR(10)) AS Name,
    ListPrice
FROM dbo.DimProduct
WHERE EnglishProductName LIKE 'Long-Sleeve Logo Jersey, M';
GO

Oto zestaw wyników.

Name        ListPrice
----------  ---------
Long-Sleev  31.2437
Long-Sleev  32.4935
Long-Sleev  49.99

E. Używanie funkcji CAST z klauzulą LIKE

W tym przykładzie money wartości kolumn są SalesYTD konwertowane na typ danych int, a następnie na typ danych char(20), aby klauzula LIKE mogła jej używać.

USE AdventureWorks2022;
GO

SELECT p.FirstName,
    p.LastName,
    s.SalesYTD,
    s.BusinessEntityID
FROM Person.Person AS p
INNER JOIN Sales.SalesPerson AS s
    ON p.BusinessEntityID = s.BusinessEntityID
WHERE CAST(CAST(s.SalesYTD AS INT) AS CHAR(20)) LIKE '2%';
GO

Oto zestaw wyników.

FirstName        LastName            SalesYTD         BusinessEntityID
---------------- ------------------- ---------------- -------------
Tsvi             Reiter              2811012.7151      279
Syed             Abbas               219088.8836       288
Rachel           Valdez              2241204.0424      289

(3 row(s) affected)

F. Używanie funkcji KONWERTUJ lub RZUTOWANIE z typem XML

W tych przykładach pokazano użycie metody CONVERT do konwertowania danych na typowy kod XML przy użyciu typu danych XML i kolumn (SQL Server).

Ten przykład konwertuje ciąg z białym znakiem, tekstem i znacznikiem na wpisany kod XML i usuwa wszystkie nieistotne białe znaki (odstęp graniczny między węzłami):

SELECT CONVERT(XML, '<root><child/></root>')

Ten przykład konwertuje podobny ciąg z białym znakiem, tekstem i znacznikiem na wpisany kod XML i zachowuje nieistotne białe znaki (granica odstępu między węzłami):

SELECT CONVERT(XML, '<root>          <child/>         </root>', 1)

W tym przykładzie rzutuje ciąg z białym znakiem, tekstem i znacznikiem na wpisany kod XML:

SELECT CAST('<Name><FName>Carol</FName><LName>Elliot</LName></Name>'  AS XML)

Aby uzyskać więcej przykładów, zobacz Tworzenie wystąpień danych XML .

G. Używanie funkcji CAST i KONWERTUJ z danymi data/godzina

GETDATE() Począwszy od wartości, w tym przykładzie jest wyświetlana bieżąca data i godzina, używa CAST metody , aby zmienić bieżącą datę i godzinę na typ danych znaków, a następnie używa CONVERT ich do wyświetlania daty i godziny w ISO 8601 formacie.

SELECT GETDATE() AS UnconvertedDateTime,
    CAST(GETDATE() AS NVARCHAR(30)) AS UsingCast,
    CONVERT(NVARCHAR(30), GETDATE(), 126) AS UsingConvertTo_ISO8601;
GO

Oto zestaw wyników.

UnconvertedDateTime     UsingCast              UsingConvertTo_ISO8601
----------------------- ---------------------- ------------------------------
2022-04-18 09:58:04.570 Apr 18 2022  9:58AM    2022-04-18T09:58:04.570

(1 row(s) affected)

Ten przykład jest w przybliżeniu przeciwieństwem poprzedniego przykładu. W tym przykładzie jest wyświetlana data i godzina jako dane znaków, używane CAST do zmiany danych znaków na typ danych daty/godziny , a następnie używane CONVERT do zmiany danych znaków na typ danych daty/godziny .

SELECT '2006-04-25T15:50:59.997' AS UnconvertedText,
    CAST('2006-04-25T15:50:59.997' AS DATETIME) AS UsingCast,
    CONVERT(DATETIME, '2006-04-25T15:50:59.997', 126) AS UsingConvertFrom_ISO8601;
GO

Oto zestaw wyników.

UnconvertedText         UsingCast               UsingConvertFrom_ISO8601
----------------------- ----------------------- ------------------------
2006-04-25T15:50:59.997 2006-04-25 15:50:59.997 2006-04-25 15:50:59.997

(1 row(s) affected)

H. Używanie funkcji KONWERTUJ z danymi binarnymi i znakowymi

W tych przykładach przedstawiono wyniki konwersji danych binarnych i znaków przy użyciu różnych stylów.

--Convert the binary value 0x4E616d65 to a character value.
SELECT CONVERT(CHAR(8), 0x4E616d65, 0) AS [Style 0, binary to character];

Oto zestaw wyników.

Style 0, binary to character
----------------------------
Name

(1 row(s) affected)

W tym przykładzie pokazano, że styl 1 może wymusić obcięcie wyniku. Znaki 0x w zestawie wyników wymuszają obcinanie.

SELECT CONVERT(CHAR(8), 0x4E616d65, 1) AS [Style 1, binary to character];

Oto zestaw wyników.

Style 1, binary to character
------------------------------
0x4E616D

(1 row(s) affected)

W tym przykładzie pokazano, że styl 2 nie obcina wyniku, ponieważ wynik nie zawiera znaków 0x.

SELECT CONVERT(CHAR(8), 0x4E616d65, 2) AS [Style 2, binary to character];

Oto zestaw wyników.

Style 2, binary to character
------------------------------
4E616D65

(1 row(s) affected)

Przekonwertuj wartość znaku "Name" na wartość binarną.

SELECT CONVERT(BINARY(8), 'Name', 0) AS [Style 0, character to binary];

Oto zestaw wyników.

Style 0, character to binary
----------------------------
0x4E616D6500000000

(1 row(s) affected)
SELECT CONVERT(BINARY(4), '0x4E616D65', 1) AS [Style 1, character to binary];

Oto zestaw wyników.

Style 1, character to binary
----------------------------
0x4E616D65

(1 row(s) affected)
SELECT CONVERT(BINARY(4), '4E616D65', 2) AS [Style 2, character to binary];

Oto zestaw wyników.

Style 2, character to binary
----------------------------------
0x4E616D65

(1 row(s) affected)

Ja. Konwertowanie typów danych daty i godziny

W tym przykładzie przedstawiono konwersję typów danych daty, godziny i daty/godziny .

DECLARE @d1 DATE,
    @t1 TIME,
    @dt1 DATETIME;

SET @d1 = GETDATE();
SET @t1 = GETDATE();
SET @dt1 = GETDATE();
SET @d1 = GETDATE();

-- When converting date to datetime the minutes portion becomes zero.
SELECT @d1 AS [DATE],
    CAST(@d1 AS DATETIME) AS [date as datetime];

-- When converting time to datetime the date portion becomes zero
-- which converts to January 1, 1900.
SELECT @t1 AS [TIME],
    CAST(@t1 AS DATETIME) AS [time as datetime];

-- When converting datetime to date or time non-applicable portion is dropped.
SELECT @dt1 AS [DATETIME],
    CAST(@dt1 AS DATE) AS [datetime as date],
    CAST(@dt1 AS TIME) AS [datetime as time];

Upewnij się, że wartości znajdują się w zgodnym zakresie podczas rozważania konwersji z daty do daty/godziny lub daty/godziny2. Minimalna wartość roku dla daty/godziny to 1753, a minimalna wartość roku to 0001data i data/godzina2.

DECLARE @d1 DATE, @dt1 DATETIME , @dt2 DATETIME2

SET @d1 = '1492-08-03'
--This is okay; Minimum YYYY for DATE is 0001

SET @dt2 = CAST(@d1 AS DATETIME2)
--This is okay; Minimum YYYY for DATETIME2 IS 0001

SET @dt1 = CAST(@d1 AS DATETIME)
--This will error with (Msg 242) "The conversion of a date data type to a datetime data type resulted in an out-of-range value."
--Minimum YYYY for DATETIME is 1753

J. Używanie funkcji KONWERTUJ z danymi data/godzina w różnych formatach

GETDATE() Począwszy od wartości, w tym przykładzie użyto CONVERT funkcji wyświetlania wszystkich stylów daty i godziny w sekcji Style daty i godziny tego artykułu.

Format # Przykładowe zapytanie Przykładowy wynik
0 SELECT CONVERT(NVARCHAR, GETDATE(), 0) 23 sierpnia 2019 r. 13:39
1 SELECT CONVERT(NVARCHAR, GETDATE(), 1) 08/23/19
2 SELECT CONVERT(NVARCHAR, GETDATE(), 2) 19.08.23
3 SELECT CONVERT(NVARCHAR, GETDATE(), 3) 23/08/19
4 SELECT CONVERT(NVARCHAR, GETDATE(), 4) 23.08.19
5 SELECT CONVERT(NVARCHAR, GETDATE(), 5) 23-08-19
6 SELECT CONVERT(NVARCHAR, GETDATE(), 6) 23 sierpnia 19
7 SELECT CONVERT(NVARCHAR, GETDATE(), 7) 23 sierpnia 19
8 lub 24 lub 108 SELECT CONVERT(NVARCHAR, GETDATE(), 8) 13:39:17
9 lub 109 SELECT CONVERT(NVARCHAR, GETDATE(), 9) Sierpień 23 2019 1:39:17:090
10 SELECT CONVERT(NVARCHAR, GETDATE(), 10) 08-23-19
11 SELECT CONVERT(NVARCHAR, GETDATE(), 11) 19/08/23
12 SELECT CONVERT(NVARCHAR, GETDATE(), 12) 190823
13 lub 113 SELECT CONVERT(NVARCHAR, GETDATE(), 13) 23 sierpnia 2019 r. 13:39:17:090
14 lub 114 SELECT CONVERT(NVARCHAR, GETDATE(), 14) 13:39:17:090
20 lub 120 SELECT CONVERT(NVARCHAR, GETDATE(), 20) 2019-08-23 13:39:17
21 lub 25 lub 121 SELECT CONVERT(NVARCHAR, GETDATE(), 21) 2019-08-23 13:39:17.090
22 SELECT CONVERT(NVARCHAR, GETDATE(), 22) 08/23/19 1:39:17
23 SELECT CONVERT(NVARCHAR, GETDATE(), 23) 2019-08-23
101 SELECT CONVERT(NVARCHAR, GETDATE(), 101) 08/23/2019
102 SELECT CONVERT(NVARCHAR, GETDATE(), 102) 2019.08.23
103 SELECT CONVERT(NVARCHAR, GETDATE(), 103) 23/08/2019
104 SELECT CONVERT(NVARCHAR, GETDATE(), 104) 23.08.2019
105 SELECT CONVERT(NVARCHAR, GETDATE(), 105) 23-08-2019
106 SELECT CONVERT(NVARCHAR, GETDATE(), 106) 23 sierpnia 2019 r.
107 SELECT CONVERT(NVARCHAR, GETDATE(), 107) 23 sierpnia 2019 r.
110 SELECT CONVERT(NVARCHAR, GETDATE(), 110) 08-23-2019
111 SELECT CONVERT(NVARCHAR, GETDATE(), 111) 2019/08/23
112 SELECT CONVERT(NVARCHAR, GETDATE(), 112) 20190823
113 SELECT CONVERT(NVARCHAR, GETDATE(), 113) 23 sierpnia 2019 r. 13:39:17.090
120 SELECT CONVERT(NVARCHAR, GETDATE(), 120) 2019-08-23 13:39:17
121 SELECT CONVERT(NVARCHAR, GETDATE(), 121) 2019-08-23 13:39:17.090
126 SELECT CONVERT(NVARCHAR, GETDATE(), 126) 2019-08-23T13:39:17.090
127 SELECT CONVERT(NVARCHAR, GETDATE(), 127) 2019-08-23T13:39:17.090
130 SELECT CONVERT(NVARCHAR, GETDATE(), 130) 22 ذو الحوة 1440 1:39:17.090P
131 SELECT CONVERT(NVARCHAR, GETDATE(), 131) 22/12/1440 1:39:17.090

K. Efekty pierwszeństwa typu danych w dozwolonych konwersjach

Poniższy przykład definiuje zmienną typu varchar(10), przypisuje wartość całkowitą do zmiennej, a następnie wybiera łączenie zmiennej z ciągiem.

DECLARE @string VARCHAR(10);
SET @string = 1;
SELECT @string + ' is a string.' AS Result

Oto zestaw wyników.

Result
-----------------------
1 is a string.

Wartość int 1 została przekonwertowana na wartość varchar.

W tym przykładzie pokazano podobne zapytanie przy użyciu zmiennej int :

DECLARE @notastring INT;
SET @notastring = '1';
SELECT @notastring + ' is not a string.' AS Result

W takim przypadku instrukcja SELECT zgłosi następujący błąd:

Msg 245, Level 16, State 1, Line 3
Conversion failed when converting the varchar value ' is not a string.' to data type int.

Aby ocenić wyrażenie @notastring + ' is not a string.', program SQL Server musi przestrzegać reguł pierwszeństwa typu danych, aby ukończyć niejawną konwersję, zanim będzie można obliczyć wynik wyrażenia. Ponieważ int ma wyższy priorytet niż varchar, program SQL Server próbuje przekonwertować ciąg na liczbę całkowitą i kończy się niepowodzeniem, ponieważ nie można przekonwertować tego ciągu na liczbę całkowitą.

Jeśli podajemy ciąg, który można przekonwertować, instrukcja powiedzie się, jak pokazano w poniższym przykładzie:

DECLARE @notastring INT;
SET @notastring = '1';
SELECT @notastring + '1'

W takim przypadku ciąg '1' można przekonwertować na wartość całkowitą 1, więc ta instrukcja SELECT zwróci wartość 2. Gdy podane typy danych są liczbami całkowitymi, operator + staje się operatorem matematycznym dodawania, a nie łączenia ciągów.

Przykłady: Azure Synapse Analytics and Analytics Platform System (PDW)

L. Korzystanie z funkcji RZUTOWANIE i KONWERTOWANIE

W tym przykładzie pobrano nazwę produktu dla tych produktów, które mają 3 wartość w pierwszej cyfrze ceny katalogowej, i konwertuje ListPrice te produkty na int. Używa AdventureWorksDW2022 ona bazy danych.

SELECT EnglishProductName AS ProductName, ListPrice
FROM dbo.DimProduct
WHERE CAST(ListPrice AS int) LIKE '3%';

W tym przykładzie pokazano to samo zapytanie, używając polecenia CONVERT zamiast CAST. Używa AdventureWorksDW2022 ona bazy danych.

SELECT EnglishProductName AS ProductName, ListPrice
FROM dbo.DimProduct
WHERE CONVERT(INT, ListPrice) LIKE '3%';

M. Używanie funkcji CAST z operatorami arytmetycznymi

W tym przykładzie obliczana jest pojedyncza wartość kolumny przez podzielenie ceny jednostkowej produktu (UnitPrice) przez wartość procentową rabatu (UnitPriceDiscountPct). Ten wynik jest następnie zaokrąglany do najbliższej liczby całkowitej, a na koniec przekonwertowany na typ danych int . W tym przykładzie użyto AdventureWorksDW2022 bazy danych.

SELECT ProductKey, UnitPrice,UnitPriceDiscountPct,
       CAST(ROUND (UnitPrice*UnitPriceDiscountPct,0) AS int) AS DiscountPrice
FROM dbo.FactResellerSales
WHERE SalesOrderNumber = 'SO47355'
      AND UnitPriceDiscountPct > .02;

Oto zestaw wyników.

ProductKey  UnitPrice  UnitPriceDiscountPct  DiscountPrice
----------  ---------  --------------------  -------------
323         430.6445   0.05                  22
213         18.5043    0.05                  1
456         37.4950    0.10                  4
456         37.4950    0.10                  4
216         18.5043    0.05                  1

N. Używanie funkcji CAST z klauzulą LIKE

W tym przykładzie kolumna ListPrice jest konwertowana na typ int, a następnie na typ char(20), aby klauzula LIKE mogła jej używać. W tym przykładzie użyto AdventureWorksDW2022 bazy danych.

SELECT EnglishProductName AS Name, ListPrice
FROM dbo.DimProduct
WHERE CAST(CAST(ListPrice AS INT) AS CHAR(20)) LIKE '2%';

O. Używanie funkcji CAST i KONWERTUJ z danymi data/godzina

W tym przykładzie jest wyświetlana bieżąca data i godzina, używa metody CAST , aby zmienić bieżącą datę i godzinę na typ danych znaków, a na koniec używa CONVERT daty i godziny w formacie ISO 8601. W tym przykładzie użyto AdventureWorksDW2022 bazy danych.

SELECT TOP(1)
   SYSDATETIME() AS UnconvertedDateTime,
   CAST(SYSDATETIME() AS NVARCHAR(30)) AS UsingCast,
   CONVERT(NVARCHAR(30), SYSDATETIME(), 126) AS UsingConvertTo_ISO8601
FROM dbo.DimCustomer;

Oto zestaw wyników.

UnconvertedDateTime     UsingCast                     UsingConvertTo_ISO8601
---------------------   ---------------------------   ---------------------------
07/20/2010 1:44:31 PM   2010-07-20 13:44:31.5879025   2010-07-20T13:44:31.5879025

Ten przykład jest szorstkim przeciwieństwem poprzedniego przykładu. W tym przykładzie jest wyświetlana data i godzina jako dane znaków, używane CAST do zmiany danych znaków na typ danych daty/godziny , a następnie używane CONVERT do zmiany danych znaków na typ danych daty/godziny . W tym przykładzie użyto AdventureWorksDW2022 bazy danych.

SELECT TOP(1)
   '2010-07-25T13:50:38.544' AS UnconvertedText,
CAST('2010-07-25T13:50:38.544' AS DATETIME) AS UsingCast,
   CONVERT(DATETIME, '2010-07-25T13:50:38.544', 126) AS UsingConvertFrom_ISO8601
FROM dbo.DimCustomer;

Oto zestaw wyników.

UnconvertedText         UsingCast               UsingConvertFrom_ISO8601
----------------------- ----------------------- ------------------------
2010-07-25T13:50:38.544 07/25/2010 1:50:38 PM   07/25/2010 1:50:38 PM

Zobacz także

Dalsze kroki