Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Azure Synapse Analytics
Analiz Platformu Sistemi (PDW)
Microsoft Fabric'teki SQL analiz uç noktası
Microsoft Fabric'teki ambar
Microsoft 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/yy101 = mm/dd/yyyy |
| 2 | 102 | Amerikan Ulusal Standartlar Enstitüsü (ANSI) | 2 = yy.mm.dd102 = yyyy.mm.dd |
| 3 | 103 | İngiliz/Fransızca | 3 = dd/mm/yy103 = dd/mm/yyyy |
| 4 | 104 | Almanca | 4 = dd.mm.yy104 = dd.mm.yyyy |
| 5 | 105 | İtalyanca | 5 = dd-mm-yy105 = dd-mm-yyyy |
| 6 | 1061 | - | 6 = dd mon yy106 = dd mon yyyy |
| 7 | 1071 | - | 7 = Mon dd, yy107 = 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.
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
- FORMAT (Transact-SQL)
- STR (Transact-SQL)
- SEÇ (Transact-SQL)
- Sistem İşlevleri (Transact-SQL)
- Harmanlama ve Unicode Desteği