Aracılığıyla paylaş


CAST ve CONVERT (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsAnaliz Platformu Sistemi (PDW)Microsoft Fabric'teki SQL analiz uç noktasıMicrosoft Fabric'teki ambarMicrosoft Fabric'teki SQL veritabanı

Bu işlevler bir veri türünün ifadesini başka bir veri türüne dönüştürür.

Sözdizimi

CAST sözdizimi:

CAST ( expression AS data_type [ ( length ) ] )

CONVERT sözdizimi:

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

Transact-SQL söz dizimi kuralları

Tartışmalar

ifade

Herhangi bir geçerli ifade.

data_type

Hedef veri türü. Buna xml, bigint ve sql_variant dahildir. Diğer ad veri türleri kullanılamaz.

uzunluk

Kullanıcının belirtilen uzunluğuna izin veren veri türleri için hedef veri türünün uzunluğunu belirten isteğe bağlı bir tamsayı. Varsayılan değer 30'dur.

üslup

İşlevin ifadeyi CONVERT nasıl çevireceğini belirten bir tamsayı ifadesi. NULL stil değeri için NULL döndürülür. data_type aralığı belirler.

Dönüş türleri

data_type çevrilmiş ifadeyi döndürür.

Tarih ve saat stilleri

Tarih veya saat veri türü ifadesi için stil , aşağıdaki tabloda gösterilen değerlerden birine sahip olabilir. Diğer değerler 0 olarak işlenir. SQL Server 2012'den (11.x) başlayarak, tarih ve saat türlerinden datetimeoffset'e dönüştürülürken desteklenen tek stiller 0 veya 1'tir. Diğer tüm dönüştürme stilleri 9809 hatası döndürür.

Uyarı

SQL Server, Kuveyt algoritmasıyla Arapça stilinde tarih biçimini destekler.

Yüzyıl olmadan (yy) 1 Century (yyy) ile Standart Giriş/çıkış 3
- 0 veya 1001,2 Datetime ve smalldatetime için varsayılan mon dd yyyy hh:miAM (veya PM)
1 101 ABD 1 = mm/dd/yy
101 = mm/dd/yyyy
2 102 Amerikan Ulusal Standartlar Enstitüsü (ANSI) 2 = yy.mm.dd
102 = yyyy.mm.dd
3 103 İngiliz/Fransızca 3 = dd/mm/yy
103 = dd/mm/yyyy
4 104 Almanca 4 = dd.mm.yy
104 = dd.mm.yyyy
5 105 İtalyanca 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 veya 24 108 - hh:mi:ss
- 9 veya 1091,2 Varsayılan + milisaniye mon dd yyyy hh:mi:ss:mmmAM (veya PM)
10 110 ABD 10 = mm-dd-yy
110 = mm-dd-yyyy
11 111 JAPONYA 11 = yy/aa/gg
111 = yyyy/mm/dd
12 112 ISO 12 = yymmdd
112 = yyyymmdd
- 13 veya 1131,2 Avrupa varsayılan + milisaniye dd mon yyyy hh:mi:ss:mmm (24 saat)
14 114 - hh:mi:ss:mmm (24 saat)
- 20 veya 1202 ODBC kurallı yyyy-mm-dd hh:mi:ss (24 saat)
- 21 veya 25 ya da 1212 Saat, tarih, tarih saat2 ve datetimeoffset için ODBC kurallı (milisaniye ile) varsayılanı yyyy-mm-dd hh:mi:ss.mmm (24 saat)
22 - ABD mm/dd/yy hh:mi:ss AM (veya PM)
- 23 ISO8601 yyyy-mm-dd
- 1264 ISO8601 yyyy-mm-ddThh:mi:ss.mmm (boşluk yok) 6
- 1278, 9 Z saat dilimiyle ISO8601 yyyy-MM-ddThh:mm:ss.fffZ (boşluk yok) 6
- 1301,2 Hicri 5 dd mon yyyy hh:mi:ss:mmmAM 7
- 1312 Hicri 5 dd/mm/yyyy hh:mi:ss:mmmAM

1 Bu stil değerleri belirsiz sonuçlar döndürür. Tüm () (yyyüzyıl olmadan) stillerini ve () (yyyycentury) stillerinin bir alt kümesini içerir.

2 Varsayılan değerler (0 veya 100, 9 veya 109, 13 veya 113, 20 veya 120, 23 ve 21 ya da 25 ya da 121) her zaman yüzyılı (yyyy) döndürür.

Önemli

Varsayılan olarak, SQL Server iki basamaklı yılları 2049 kesme yılını temel alarak yorumlar. Bu, SQL Server'ın iki basamaklı 49 yılı 2049 ve iki basamaklı 50 yılını 1950 olarak yorumlaması anlamına gelir. Otomasyon nesnelerini temel alan uygulamalar da dahil olmak üzere birçok istemci uygulaması 2030'un kesme yılını kullanır. SQL Server, SQL Server tarafından kullanılan kesme yılını değiştirmek için iki basamaklı yıl kesme yapılandırması seçeneği sağlar. Bu, tarihlerin tutarlı bir şekilde işlenmesini sağlar. Dört basamaklı yıl belirtmenizi öneririz.

3Datetime'a dönüştürdüğünüzde giriş; karakter verilerine dönüştürdüğünüzde çıkış.

4 XML kullanımı için tasarlanmıştır. datetime veya smalldatetime'dan karakter verilerine dönüştürme için çıkış biçimi için önceki tabloya bakın.

5 Hicri, çeşitli varyasyonlara sahip bir takvim sistemidir. SQL Server Kuveyt algoritmasını kullanır.

6 Milisaniye (mmm) 0 değeri için milisaniye ondalık kesir değeri görüntülenmez. Örneğin, değer 2022-11-07T18:26:20.000 olarak 2022-11-07T18:26:20görüntülenir.

7 Bu stilde, mon tam ay adının çok belirteçli Hicri Unicode gösterimini temsil eder. Bu değer, SSMS'nin varsayılan ABD yüklemesinde doğru şekilde işlenmez.

8 Yalnızca karakter verilerinden datetime veya smalldatetime'a türerken desteklenir. Datetime veya smalldatetime veri türlerine yalnızca tarih veya saat bileşenlerini temsil eden karakter verileri yayınlanırken, belirtilmeyen saat bileşeni olarak 00:00:00.000ayarlanır ve belirtilmeyen tarih bileşeni olarak 1900-01-01ayarlanır.

9 Saat dilimi bilgilerine sahip XML Z değerlerini saat dilimi olmayan SQL Server tarih saat değerleriyle eşlemeyi kolaylaştırmak için isteğe bağlı saat dilimi göstergesini kullanın. Z UTC-0 saat dilimini gösterir. HH:MM Veya + yönündeki - uzaklık, diğer saat dilimlerini gösterir. Örneğin: 2022-12-12T23:45:12-08:00.

Smalldatetime karakter verilerine dönüştürülürken, saniye veya milisaniye içeren stiller bu konumlarda sıfırları gösterir. datetime veya smalldatetime değerlerinden dönüştürürken, istenmeyen tarih bölümlerinin kesilmesi için uygun karakter veya varchar veri türü uzunluğunu kullanın.

Karakter verilerini datetimeoffset'e dönüştürürken, saat içeren bir stil kullanıldığında, sonuca saat dilimi uzaklığı eklenir.

float ve gerçek stiller

Kayan veya gerçekifade için stil aşağıdaki tabloda gösterilen değerlerden birine sahip olabilir. Diğer değerler 0 olarak işlenir.

Değer Çıktı
0 (varsayılan) En fazla 6 basamak. Uygun olduğunda bilimsel gösterimi kullanın.
1 Her zaman 8 basamak. Bilimsel gösterimi her zaman kullanın.
2 Her zaman 16 basamak. Bilimsel gösterimi her zaman kullanın.
3 Her zaman 17 basamak. Kayıpsız dönüştürme için kullanın. Bu stilde, her ayrı kayan veya gerçek değerin ayrı bir karakter dizesine dönüştürülmesi garanti edilir.

Şunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümleri ile Azure SQL Veritabanı.
126, 128, 129 Eski nedenlerle dahil. Bu değerleri yeni geliştirme için kullanmayın.

para ve smallmoney stilleri

Bir money veya smallmoneyifadesi için, stil aşağıdaki tabloda gösterilen değerlerden birine sahip olabilir. Diğer değerler 0 olarak işlenir.

Değer Çıktı
0 (varsayılan) Ondalık noktasının solundaki her üç basamakta virgül ve ondalık noktasının sağındaki iki basamak yok

Örnek: 4235.98.
1 Ondalık noktasının solundaki her üç basamakta bir virgül ve ondalık noktasının sağındaki iki basamak

Örnek: 3.510,92.
2 Ondalık noktasının solundaki her üç basamakta virgül ve ondalık noktasının sağındaki dört basamak yok

Örnek: 4235.9819.
126 Char(n) veya varchar(n) değerine dönüştürülürken stil 2'ye eşdeğer

xml stilleri

Bir xmlifadesi için, stil aşağıdaki tabloda gösterilen değerlerden birine sahip olabilir. Diğer değerler 0 olarak işlenir.

Değer Çıktı
0 (varsayılan) Önemsiz boşlukları atan ve iç DTD alt kümesine izin verilmeyen varsayılan ayrıştırma davranışını kullanın.

Not:XML veri türüne dönüştürülürken, SQL Server önemsiz boşluk XML 1.0'dan farklı işlenir. Daha fazla bilgi için bkz. XML Verilerinin Örneklerini Oluşturma.
1 Önemsiz boşlukları koruyun. Bu stil ayarı, varsayılan xml:space işlemeyi davranışıyla xml:space="preserve"eşleşecek şekilde ayarlar.
2 Sınırlı iç DTD alt kümesi işlemeyi etkinleştirin.

Etkinleştirilirse, sunucu, bir iç DTD alt kümesinde sağlanan aşağıdaki bilgileri kullanarak doğrulanmayan ayrıştırma işlemleri gerçekleştirebilir.

- Öznitelikler için varsayılanlar uygulanır
- İç varlık başvuruları çözümlenir ve genişletilir
- DTD içerik modeli, sağlamlık açısından denetlenir

Ayrıştırıcı dış DTD alt kümelerini yoksayar. Ayrıca, tek başına özniteliğin evet veya hayır değerine sahip olup olmadığını görmek için XML bildirimini değerlendirmez. Bunun yerine, XML örneğini tek başına bir belge olarak ayrıştırıyor.
3 Önemsiz boşlukları koruyun ve sınırlı iç DTD alt kümesi işlemeyi etkinleştirin.

İkili stiller

İkili(n), karakter(n), varbinary(n)veya varchar(n)ifadesi için, stil aşağıdaki tabloda gösterilen değerlerden birine sahip olabilir. Tabloda listelenmeyen stil değerleri hata döndürür.

Değer Çıktı
0 (varsayılan) ASCII karakterlerini ikili baytlara veya ikili baytları ASCII karakterlerine çevirir. Her karakter veya bayt 1:1'e dönüştürülür.

İkili data_type için sonucun soluna 0x karakterleri eklenir.
1, 2 İkili data_type için ifade bir karakter ifadesi olmalıdır. İfadeninçift sayıda onaltılık basamak (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, a, b, c, d, e, f) olması gerekir. Stil 1 olarak ayarlanırsa, ifadenin ilk iki karakter olarak 0x olması gerekir. İfade tek sayıda karakter içeriyorsa veya karakterlerden biri geçersizse bir hata oluşur.

Dönüştürülen ifadenin uzunluğu data_type uzunluğunu aşarsa, sonuç sağ kesilmiş olur.

Dönüştürülen sonuçtan daha büyük olan data_typeuzunluğu sabittir ve sonucun sağındaki sıfırlar eklenir.

Tür karakteri data_type ikili ifade gerektirir. Her ikili karakter iki onaltılık karaktere dönüştürülür. Dönüştürülen ifadenin uzunluğunun data_type uzunluğunu aştığını varsayalım. Bu durumda kesilir.

Sabit boyutlu karakter türü data_type, dönüştürülen sonucun uzunluğu data_type uzunluğundan küçükse, çift sayıda onaltılık basamak tutmak için dönüştürülen ifadenin sağındaki boşluklar eklenir.

0x karakterleri, stil 2 için dönüştürülen sonucun soluna eklenmez.

Örtük dönüştürmeler

Örtük dönüştürmeler, işlevin veya işlevin CAST belirtimini CONVERT gerektirmez. Açık dönüştürmeler işlevin veya işlevin CAST belirtimini CONVERT gerektirir. Aşağıdaki çizimde, SQL Server sistem tarafından sağlanan veri türleri için izin verilen tüm açık ve örtük veri türü dönüştürmeleri gösterilmektedir. Bunlar bigint, sql_variant ve xml'yi içerir. sql_variant veri türünden atamada örtük dönüştürme yoktur, ancak sql_variant örtük dönüştürme vardır.

Tavsiye

Microsoft İndirme Merkezi'nin bu grafiği PNG dosyası olarak indirilebilir.

Olası veri türü dönüştürmelerinin tablosunu gösteren diyagram.

Yukarıdaki grafik, SQL Server'da izin verilen tüm açık ve örtük dönüştürmeleri gösterir, ancak dönüştürmenin sonuç veri türü gerçekleştirilmekte olan işleme bağlıdır:

  • Açık dönüştürmeler için, sonuçta elde edilen veri türünü deyiminin kendisi belirler.
  • Örtük dönüştürmeler için, değişkenin değerini ayarlama veya bir sütuna değer ekleme gibi atama deyimleri, değişken bildirimi veya sütun tanımı tarafından tanımlanan veri türüyle sonuçlanır.
  • Karşılaştırma işleçleri veya diğer ifadeler için, sonuçta elde edilen veri türü veri türü önceliği kurallarına bağlıdır.

Tavsiye

Veri türü önceliğini dönüştürmelerdeki etkileri hakkında pratik bir örnek bu bölümün devamında görülebilir.

datetimeoffset ile char, nchar, nvarchar ve varchar karakter türleri arasında dönüştürme yaptığınızda, dönüştürülen saat dilimi uzaklık bölümü her zaman hem hem HHde MM için çift basamaklı olmalıdır. Örneğin, -08:00.

Unicode verileri her zaman çift sayıda bayt kullandığından, ikili veya varbinary'yi Unicode tarafından desteklenen veri türlerine veya bu veri türlerinden dönüştürürken dikkatli olun. Örneğin, aşağıdaki dönüştürme 41 onaltılık bir değer döndürmez. 4100 onaltılık bir değer döndürür:

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

Daha fazla bilgi için bkz. Harmanlama ve Unicode Desteği.

Büyük değerli veri türleri

Büyük değerli veri türleri, özellikle nvarchar, varbinary ve varchar veri türleri gibi küçük karşılıklarıyla aynı örtük ve açık dönüştürme davranışına sahiptir. Ancak aşağıdaki yönergeleri göz önünde bulundurun:

  • Görüntüdenvarbinary(max)'e dönüştürme ve tam tersi, metin ile varchar(max), ntext ve nvarchar(max)arasındaki dönüştürmeler gibi örtük dönüştürme olarak çalışır.
  • Varchar(max) gibi büyük değerli veri türlerinden varchar gibi daha küçük bir karşılık gelen veri türüne dönüştürme örtük bir dönüştürmedir, ancak büyük değerin boyutu daha küçük veri türünün belirtilen uzunluğunu aşarsa kesme gerçekleşir.
  • nvarchar, varbinary veya varchar'dan karşılık gelen büyük değerli veri türlerine dönüştürme örtük olarak gerçekleşir.
  • sql_variant veri türünden büyük değerli veri türlerine dönüştürme açık bir dönüştürmedir.
  • Büyük değerli veri türleri sql_variant veri türüne dönüştürülemez.

Xml veri türünden dönüştürme hakkında daha fazla bilgi için bkz. XML Verilerinin Örneklerini Oluşturma.

xml veri türü

Xml veri türünü bir dizeye veya ikili veri türüne açıkça veya örtük olarak yayınladığınızda, xml veri türünün içeriği tanımlı bir kural kümesine göre serileştirilir. Bu kurallar hakkında bilgi için bkz. XML Verilerini Serileştirmeyi Tanımlama. Diğer veri türlerinden xml veri türüne dönüştürme hakkında bilgi için bkz. XML Verilerinin Örneklerini Oluşturma.

metin ve görüntü veri türleri

Metin ve görüntü veri türleri otomatik veri türü dönüştürmeyi desteklemez. Metin verilerini açıkça karakter verilerine, görüntü verilerini de ikili veya varbinary'ye dönüştürebilirsiniz, ancak uzunluk üst sınırı 8000 bayttır. Yanlış dönüştürmeyi denerseniz, örneğin harf içeren bir karakter ifadesini int'e dönüştürmeye çalışırsanız, SQL Server bir hata iletisi döndürür.

Çıkış harmanlaması

veya CAST işlevleri bir karakter dizesi çıktısı CONVERT aldığında ve bir karakter dizesi girişi aldığında, çıkış girişle aynı harmanlama ve harmanlama etiketine sahiptir. Giriş bir karakter dizesi değilse, çıkışta veritabanının varsayılan harmanlaması ve coercible-default harmanlama etiketi bulunur. Daha fazla bilgi için bkz. Harmanlama Önceliği (Transact-SQL).

Çıkışa farklı bir harmanlama atamak için, or CAST işlevinin sonuç ifadesine COLLATE yan tümcesini CONVERT uygulayın. Örneğin:

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

Kesme ve yuvarlama sonuçları

Karakter veya ikili ifadeleri (ikili, karakter, nchar, nvarchar, varbinary veya varchar) farklı bir veri türündeki bir ifadeye dönüştürürken, dönüştürme işlemi çıkış verilerini kesebilir, yalnızca çıkış verilerini kısmen görüntüleyebilir veya hata döndürebilir. Bu durumlar, sonucun görüntülenemeyecek kadar kısa olması durumunda ortaya çıkar. İkili, karakter, nchar, nvarchar, varbinary veya varchar dönüştürmeleri, aşağıdaki tabloda gösterilen dönüştürmeler dışında kesilir.

Veri türünden Veri türüne Sonuç
int, smallint veya tinyint Char
varchar
Görüntülenemeyecek kadar kısa
nchar
nvarchar
Hata 1
money, smallmoney, sayısal, ondalık, kayan veya gerçek Char
varchar
Hata 1
nchar
nvarchar
Hata 1

1 Sonuç uzunluğu görüntülenemeyecek kadar kısa olduğundan hata döndürüldü.

SQL Server yalnızca gidiş dönüş dönüştürmelerinin, başka bir deyişle bir veri türünü özgün veri türünden tekrar dönüştüren dönüştürmelerin sürümden sürüme aynı değerleri vermesini garanti eder. Aşağıdaki örnekte böyle bir gidiş dönüş dönüştürme gösterilmektedir:

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

Uyarı

İkili değerler oluşturmayın ve sonra bunları sayısal veri türü kategorisinin veri türüne dönüştürün. SQL Server, ikiliye ondalık veya sayısal veri türü dönüştürme işleminin sonucunun SQL Server sürümleri arasında aynı olacağını garanti etmez.

Aşağıdaki örnekte, görüntülenemeyecek kadar küçük bir sonuç ifadesi gösterilmektedir.

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

Sonuç kümesi aşağıdadır.

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

(5 row(s) affected)

Ondalık basamaklarda farklılık gösteren veri türlerini dönüştürdüğünüzde, SQL Server bazen kesilmiş bir sonuç değeri döndürür ve bazen yuvarlatılmış bir değer döndürür. Bu tabloda davranış gösterilir.

Kaynak İçin Davranış
Sayısal Sayısal Yuvarlak
Sayısal Int Kısalt
Sayısal para Yuvarlak
para Int Yuvarlak
para Sayısal Yuvarlak
yüzmek Int Kısalt
yüzmek Sayısal Yuvarlak 1
yüzmek tarih ve saat Yuvarlak
tarih ve saat Int Yuvarlak

1 Bilimsel gösterim kullanan kayandeğerlerin ondalık veya sayısal olarak dönüştürülmesi yalnızca 17 basamaklı duyarlık değerleriyle sınırlıdır. Duyarlık değeri 17'den yüksek olan tüm değerler sıfıra yuvarlar.

Örneğin, int veya sayısal türlere dönüştürme sırasında 10,6496 ve -10,6496 değerleri kesilebilir veya yuvarlanabilir:

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;

Sorgunun sonuçları aşağıdaki tabloda gösterilmiştir:

trunc1 trunc2 yuvarlak1 yuvarlak2
10 -10 11 -11

Hedef veri türünün kaynak veri türünden daha az ondalık basamak bulunduğu veri türleri dönüştürülürken, değer yuvarlanır. Örneğin, bu dönüştürme döndürür $10.3497:

SELECT CAST(10.3496847 AS money);

SQL Server sayısal olmayan karakter, nchar, nvarchar veya varchar verilerini ondalık, kayan, int, sayısala dönüştürürken bir hata iletisi döndürür. Boş bir dize (" ") sayısal veya ondalık değere dönüştürüldüğünde SQL Server da hata döndürür.

Belirli tarih saat dönüştürmeleri belirsizdir

Dizeden tarihe saat dönüştürmesinin belirleyici olmadığı stiller aşağıdaki gibidir:

  • 100 1'in altındaki tüm stiller
  • 106
  • 107
  • 109
  • 113
  • 130

1 Stiller 20 ve 21 dışında

Daha fazla bilgi için bkz. Değişmez tarih dizelerini DATE değerlerine dönüştürme.

Ek karakterler (vekil çiftler)

SQL Server 2012'den (11.x) başlayarak, tamamlayıcı karakter (SC) harmanlamaları kullanıldığında, CASTnchar veya nvarchar'dan daha küçük uzunlukta bir nchar veya nvarchar türüne yapılan bir işlem vekil çiftin içinde kesilmez. Bunun yerine, işlem tamamlayıcı karakterden önce kesilir. Örneğin, aşağıdaki kod parçası yalnızca @xöğesini tutarak ayrılır'ab'. Ek karakteri tutmak için yeterli alan yok.

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

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

SC harmanlamaları kullanılırken , davranışı CONVERTile benzerdir CAST. Daha fazla bilgi için bkz. Harmanlama ve Unicode Desteği - Ek Karakterler.

Uyumluluk desteği

SQL Server'ın önceki sürümlerinde, CASTCONVERT veri türlerindeki ve işlemleri için varsayılan stil 121'dir, ancak her iki tür de hesaplanan sütun ifadesinde kullanılır. Hesaplanan sütunlar için varsayılan stil 0'dır. Bu davranış, hesaplanmış sütunlar oluşturulduğunda, otomatik parametreleştirme içeren sorgularda kullanıldığında veya kısıtlama tanımlarında kullanıldığında etkilenir.

Uyumluluk düzeyi 110 ve üzeri altında, CASTCONVERT ve datetime2 veri türlerinde ve işlemleri her zaman varsayılan stil olarak 121'e sahiptir. Bir sorgu eski davranışı kullanıyorsa, 110'dan küçük bir uyumluluk düzeyi kullanın veya etkilenen sorguda 0 stilini açıkça belirtin.

Uyumluluk düzeyi değeri ve CASTCONVERT için varsayılan stil Hesaplanan sütun için varsayılan stil
< 110 121 0
> = 110 121 121

1 Hesaplanan sütunlar dışında

Veritabanının uyumluluk düzeyi 110'a yükseltilmesi, diskte depolanan kullanıcı verilerini değiştirmez. Bu verileri uygun şekilde el ile düzeltmeniz gerekir. Örneğin, yukarıda açıklanan hesaplanan sütun ifadesini içeren bir kaynaktan tablo oluşturmak için SELECT INTO kullandıysanız, veriler (stil 0 kullanılarak) hesaplanan sütun tanımının kendisi yerine depolanır. Bu verileri 121 stiliyle eşleşecek şekilde el ile güncelleştirmeniz gerekir.

Örnekler

A. Hem CAST hem de CONVERT kullanma

Bu örnekler, liste fiyatının ilk basamasına sahip 3 olan ve değerlerini ListPrice dönüştüren ürünler için ürünün adını alır.

CAST kullanın:

USE AdventureWorks2022;
GO

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

CONVERT kullanın:

USE AdventureWorks2022;
GO

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

Sonuç kümesi aşağıdadır. Örnek sonuç kümesi hem hem CASTde CONVERT için aynıdır.

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. Aritmetik işleçlerle CAST kullanma

Bu örnek, yıllık toplam satışları () komisyon yüzdesine (Computed) bölerek tek bir sütun hesaplaması (SalesYTDCommissionPCT) hesaplar. Bu değer en yakın tamsayıya yuvarlanıp bir CASTint veri türüne yuvarlanir.

USE AdventureWorks2022;
GO

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

Sonuç kümesi aşağıdadır.

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

(14 row(s) affected)

C. Birleştirmek için CAST kullanma

Bu örnek, kullanarakcharacter CASTolmayan ifadeleri birleştirir. Veritabanını kullanır AdventureWorksDW2025 .

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

Sonuç kümesi aşağıdadır.

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. Daha okunabilir metin oluşturmak için CAST kullanma

Bu örnek, sütunu CAST sütununa dönüştürmek Name için SELECT listesinde kullanır. Veritabanını kullanır AdventureWorksDW2025 .

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

Sonuç kümesi aşağıdadır.

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

E. LIKE yan tümcesiyle CAST kullanma

Bu örnek sütun money değerlerini SalesYTD veri türüne ve sonra char(20) veri türüne dönüştürürLIKE, böylece yan tümcesi bunu kullanabilir.

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

Sonuç kümesi aşağıdadır.

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

(3 row(s) affected)

F. Türü yazılan XML ile CONVERT veya CAST kullanma

Bu örneklerde CONVERT kullanılarak verileri yazılan XML'e dönüştürmek için kullanımı gösterilmektedir.

Bu örnek boşluk, metin ve işaretleme içeren bir dizeyi yazılan XML'e dönüştürür ve tüm önemsiz boşlukları (düğümler arasındaki sınır boşluğu) kaldırır:

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

Bu örnek, boşluk, metin ve işaretleme içeren benzer bir dizeyi yazılan XML'e dönüştürür ve önemsiz boşluk (düğümler arasındaki sınır boşluğu) korur:

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

Bu örnek boşluk, metin ve işaretleme içeren bir dizeyi yazılan XML'ye aktarır:

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

Daha fazla örnek için bkz. XML Verilerinin Örnekleri Oluşturma .

G. TARIH saat verileriyle CAST ve CONVERT kullanma

Değerlerden GETDATE() başlayarak, bu örnek geçerli tarih ve saati görüntüler, geçerli tarih ve saati karakter veri türüyle değiştirmek için kullanır CAST ve ardından tarih ve saati CONVERT biçimde görüntülemek için kullanırISO 8601.

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

Sonuç kümesi aşağıdadır.

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)

Bu örnek, önceki örneğin yaklaşık tersidir. Bu örnekte bir tarih ve saat karakter verileri olarak görüntülenir, karakter verilerini CAST veri türüne dönüştürmek için kullanılır ve ardından karakter verilerini CONVERT veri türüne değiştirmek için kullanılır.

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

Sonuç kümesi aşağıdadır.

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. İkili ve karakter verileriyle CONVERT kullanma

Bu örnekler, farklı stiller kullanarak ikili ve karakter verisi dönüştürmenin sonuçlarını gösterir.

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

Sonuç kümesi aşağıdadır.

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

(1 row(s) affected)

Bu örnekte, Stil 1'in sonucun kesilmesini zorlayabileceği gösterilmektedir. Sonuç kümesindeki 0x karakterleri kesmeyi zorlar.

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

Sonuç kümesi aşağıdadır.

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

(1 row(s) affected)

Bu örnekte, sonuç 0x karakterlerini içermediğinden Stil 2'nin sonucu kesmediğini gösterir.

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

Sonuç kümesi aşağıdadır.

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

(1 row(s) affected)

'Name' karakter değerini ikili değere dönüştürün.

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

Sonuç kümesi aşağıdadır.

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

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

Sonuç kümesi aşağıdadır.

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

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

Sonuç kümesi aşağıdadır.

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

(1 row(s) affected)

Ben. Tarih ve saat veri türlerini dönüştürme

Bu örnekte tarih, saat ve tarih saat veri türlerinin dönüştürülmesi gösterilmektedir.

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];

Datetime veya datetime2 dönüştürmesini göz önünde bulundurarak değerlerin uyumlu bir aralık içinde olduğundan emin olun. Datetime için en düşük yıl değeri olurken1753, en düşük yıl değeri 0001date ve datetime2 içindir.

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. FARKLı biçimlerde tarih saat verileriyle CONVERT kullanma

Değerlerden GETDATE() başlayarak, bu örnekte CONVERT bu makalenin Tarih ve Saat stilleri bölümündeki tüm tarih ve saat stilleri görüntülenir.

Biçim # Örnek sorgu Örnek sonuç
0 SELECT CONVERT(NVARCHAR, GETDATE(), 0) 23 Ağustos 2019 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 Ağustos 19
7 SELECT CONVERT(NVARCHAR, GETDATE(), 7) 23 Ağustos 19
8 veya 24 ya da 108 SELECT CONVERT(NVARCHAR, GETDATE(), 8) 13:39:17
9 veya 109 SELECT CONVERT(NVARCHAR, GETDATE(), 9) 23 Ağustos 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 veya 113 SELECT CONVERT(NVARCHAR, GETDATE(), 13) 23 Ağustos 2019 13:39:17:090
14 veya 114 SELECT CONVERT(NVARCHAR, GETDATE(), 14) 13:39:17:090
20 veya 120 SELECT CONVERT(NVARCHAR, GETDATE(), 20) 2019-08-23 13:39:17
21, 25 veya 121 SELECT CONVERT(NVARCHAR, GETDATE(), 21) 2019-08-23 13:39:17.090
22 SELECT CONVERT(NVARCHAR, GETDATE(), 22) 23.08.19 13: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 Ağustos 2019
107 SELECT CONVERT(NVARCHAR, GETDATE(), 107) 23 Ağustos 2019, Ağustos 2019
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 Ağustos 2019 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) 12.22.1440 1:39:17.090

K. İzin verilen dönüştürmelerde veri türü önceliği etkileri

Aşağıdaki örnek varchar(10) türünde bir değişken tanımlar, değişkene bir tamsayı değeri atar ve ardından değişkeni bir dizeyle birleştirmeyi seçer.

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

Sonuç kümesi aşağıdadır.

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

1 int değeri varchar'a dönüştürüldü.

Bu örnekte, bunun yerine int değişkeni kullanan benzer bir sorgu gösterilmektedir:

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

Bu durumda SELECT deyimi aşağıdaki hatayı döndürür:

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

ifadesini @notastring + ' is not a string.'değerlendirmek için, sql Server'ın ifadenin sonucu hesaplanmadan önce örtük dönüştürmeyi tamamlamak için veri türü önceliği kurallarına uyması gerekir. int, varchar değerinden daha yüksek bir önceliğe sahip olduğundan, SQL Server dizeyi tamsayıya dönüştürmeyi dener ve bu dize tamsayıya dönüştürülemediğinden başarısız olur.

Dönüştürülebilecek bir dize sağlarsak, aşağıdaki örnekte görüldüğü gibi deyimi başarılı olur:

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

Bu durumda, dize '1' 1 tamsayı değerine dönüştürülebilir, bu nedenle bu SELECT deyimi 2 değerini döndürür. Sağlanan veri türleri tamsayı olduğunda , + işleci bir dize birleştirme yerine matematik işleci ekler.

Örnekler: Azure Synapse Analytics ve Analytics Platform Sistemi (PDW)

L. CAST ve CONVERT kullanma

Bu örnek, liste fiyatının ilk bassamında bulunan 3 ürünler için ürünün adını alır ve bu ürünlerin adını ListPrice dönüştürür. Veritabanını kullanırAdventureWorksDW2025.

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

Bu örnek, yerine CONVERTkullanarak CAST aynı sorguyu gösterir. Veritabanını kullanır AdventureWorksDW2025 .

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

M. Aritmetik işleçlerle CAST kullanma

Bu örnek, ürün birim fiyatını () indirim yüzdesineUnitPrice (UnitPriceDiscountPct) bölerek tek bir sütun değeri hesaplar. Bu sonuç daha sonra en yakın tamsayıya yuvarlanıp son olarak int veri türüne dönüştürülür. Bu örnekte veritabanı kullanılır AdventureWorksDW2025 .

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

Sonuç kümesi aşağıdadır.

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. LIKE yan tümcesiyle CAST kullanma

Bu örnek , LIKE yan tümcesinin kullanabilmesi için money sütununu ListPrice bir int türüne ve sonra bir char(20) türüne dönüştürür. Bu örnekte veritabanı kullanılır AdventureWorksDW2025 .

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

O. TARIH saat verileriyle CAST ve CONVERT kullanma

Bu örnekte geçerli tarih ve saat görüntülenir, geçerli tarih ve saati karakter veri türüyle değiştirmek için kullanılır CASTCONVERT ve son olarak tarih ve saati ISO 8601 biçiminde görüntüler. Bu örnekte veritabanı kullanılır AdventureWorksDW2025 .

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

Sonuç kümesi aşağıdadır.

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

Bu örnek, önceki örneğin kabaca tersidir. Bu örnekte bir tarih ve saat karakter verileri olarak görüntülenir, karakter verilerini CAST veri türüne dönüştürmek için kullanılır ve ardından karakter verilerini CONVERT veri türüne değiştirmek için kullanılır. Bu örnekte veritabanı kullanılır AdventureWorksDW2025 .

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;

Sonuç kümesi aşağıdadır.

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

Ayrıca bakınız

Sonraki Adımlar