Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:programu SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
punkt końcowy analizy SQL w usłudze Microsoft Fabric
Magazyn 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 () (yy
bez wieku) style i podzbiór stylów () (yyyy
z 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-01
wartość .
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.
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 CONVERT
jest 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 CAST
CONVERT
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 CONVERT 1 |
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 0001
data 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
- FORMAT (Transact-SQL)
- STR (Transact-SQL)
- WYBIERZ (Transact-SQL)
- Funkcje systemowe (Transact-SQL)
- Sortowanie i obsługa Unicode