Aracılığıyla paylaş


Duyarlık, ölçek ve uzunluk (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ı

Duyarlık, bir sayıdaki basamak sayısıdır. Ölçek, bir sayının ondalık noktasının sağındaki basamak sayısıdır. Örneğin, sayının 123.45 duyarlığı 5 ve ölçeği vardır 2.

SQL Server'da, sayısal ve ondalık veri türlerinin varsayılan en yüksek duyarlığı 38'dir.

Sayısal veri türünün uzunluğu, sayıyı depolamak için kullanılan bayt sayısıdır. Varchar ve char için karakter dizesinin uzunluğu bayt sayısıdır. nvarchar ve nchar için karakter dizesinin uzunluğu bayt çiftlerinin sayısıdır. İkili, varbinary ve görüntü veri türlerinin uzunluğu bayt sayısıdır. Örneğin, int veri türü 10 basamak barındırabilir, 4 bayt olarak depolanır ve ondalık noktaları kabul etmez. Int veri türünün duyarlığı 10, uzunluğu 4 ve ölçeği 0'dır.

  • Varchar, ikili veya varbinary ifade olmak üzere iki karakteri birleştirirken, sonuçta elde edilen ifadenin uzunluğu iki kaynak ifadenin uzunluklarının toplamıdır ve en fazla 8.000 bayt olur.

  • İki nchar veya nvarchar ifadesini birleştirirseniz, sonuçta elde edilen ifadenin uzunluğu, en fazla 4.000 bayt çifti olan iki kaynak ifadenin uzunluklarının toplamıdır.

  • , veya UNIONkullanarak EXCEPTINTERSECTaynı veri türündeki ancak farklı uzunluklarda iki ifadeyi karşılaştırdığınızda, sonuçta elde edilen uzunluk iki ifadeden daha uzun olur.

Remarks

Ondalık dışında sayısal veri türlerinin duyarlığı ve ölçeği sabittir. Bir aritmetik işleç aynı türde iki ifadeye sahip olduğunda, sonuç, bu tür için tanımlanan duyarlık ve ölçekle aynı veri türüne sahiptir. Bir işleç farklı sayısal veri türlerine sahip iki ifadeye sahipse, veri türü önceliği kuralları sonucun veri türünü tanımlar. Sonuç, veri türü için tanımlanan duyarlık ve ölçeke sahiptir.

Aşağıdaki tabloda, bir işlemin sonucu ondalık türünde olduğunda sonucun duyarlığı ve ölçeğinin nasıl hesaplanmış olduğu açıklanmaktadır. Aşağıdakilerden biri olduğunda sonuç ondalık olur:

  • her iki ifade de ondalıktır.
  • İfadelerden biri ondalık , diğeri ise ondalıktan daha düşük önceliğe sahip bir veri türüdür.

İşlenen ifadeler, duyarlık ve ölçek e1ile ifade , duyarlık p1s1 ve ölçek e2ile ifade p2olarak s2gösterilir. Ondalık olmayan ifadelerin duyarlığı ve ölçeği, ifadenin veri türü için tanımlanan duyarlık ve ölçektir. işlevimax(a, b), veya adeğerinin daha büyük olduğunu b gösterir. Benzer şekilde, min(a, b) veya adeğerinin daha küçük olduğunu b gösterir.

Operation Sonuç hassasiyeti Sonuç ölçeği 1
e1 + e2 max(s1, s2) + max(p1 - s1, p2 - s2) + 1 max(s1, s2)
e1 - e2 max(s1, s2) + max(p1 - s1, p2 - s2) + 1 max(s1, s2)
e1 * e2 p1 + p2 + 1 S1 + S2
e1 / e2 p1 - s1 + s2 + max(6, s1 + p2 + 1) max(6, s1 + p2 + 1)
e1 { UNION | | HARIÇ INTERSECT } e2 max(s1, s2) + max(p1 - s1, p2 - s2) max(s1, s2)
e1 % e2 min(p1 - s1, p2 - s2) + max(s1, s2) max(s1, s2)

1 Sonuç duyarlığı ve ölçeği mutlak en fazla 38'e sahiptir. Bir sonuç duyarlığı 38'den büyük olduğunda, 38'e indirilir ve ilgili ölçek, sonucun tamsayı kısmının kesilmesini önlemek için azaltılır. Çarpma veya bölme gibi bazı durumlarda, taşma hatası ortaya çıkarılsa da ondalık duyarlığı korumak için ölçek faktörü azaltılamaz.

Ayrıca ve çıkarma işlemlerine ek olarak, ondalık sayının tamsayı kısmını depolamak için basamaklara ihtiyacımız vardır max(p1 - s1, p2 - s2) . Bunları depolamak için yeterli alan yoksa (başka bir ifadeyle max(p1 - s1, p2 - s2) < min(38, precision) - scale), tamser parça için yeterli alan sağlamak üzere ölçek azaltılır. Elde edilen ölçek olur, min(precision, 38) - max(p1 - s1, p2 - s2)bu nedenle kesirli kısım, sonuçta elde edilen ölçeğe sığacak şekilde yuvarlanabilir.

Çarpma ve bölme işlemlerinde, sonucun ayrılmaz kısmını depolamak için yerlere ihtiyacımız vardır precision - scale . Ölçek aşağıdaki kurallar kullanılarak azaltılabilir:

  1. Tamser bölümü 32'den küçükse, sonuçta elde edilen ölçek değerine indirilir min(scale, 38 - (precision-scale)) , çünkü değerinden 38 - (precision-scale)büyük olamaz. Bu durumda sonuç yuvarlanabilir.
  2. Ölçek 6'dan küçükse ve integral bölümü 32'den büyükse değiştirilmez. Bu durumda, ondalık (38, ölçek) içine sığamazsa taşma hatası oluşabilir.
  3. Ölçek, 6'dan büyükse ve integral bölümü 32'den büyükse 6 olarak ayarlanır. Bu durumda hem tamsayı bölümü hem de ölçek azaltılır ve sonuç türü ondalık (38, 6) olur. Sonuç 7 ondalık basamağı yuvarlanabilir veya tamsayı parçası 32 basamağı sığamıyorsa taşma hatası oluşur.

Examples

Sonuç 0.00000090000000000 içine sığabileceğinden, aşağıdaki ifade yuvarlama olmadan sonuç döndürür:

SELECT CAST(0.0000009000 AS DECIMAL(30, 20)) * CAST(1.0000000000 AS DECIMAL(30, 20)) [decimal(38, 17)];

Bu durumda duyarlık , 61ölçek ise olur 40.

İntegral bölümü (precision-scale = 21) 32'den küçüktür, bu nedenle çarpma kurallarında ilk büyük/küçük harftir ve ölçek olarak min(scale, 38 - (precision-scale)) = min(40, 38 - (61-40)) = 17hesaplanır. Sonuç türü ondalık(38, 17)'dir.

Aşağıdaki ifade sonucu 0.000001 içine sığacak şekilde döndürür:

SELECT CAST(0.0000009000 AS DECIMAL(30, 10)) * CAST(1.0000000000 AS DECIMAL(30, 10)) [decimal(38, 6)];

Bu durumda duyarlık , 61ölçek ise olur 20.

Ölçek 6'dan büyük ve integral bölümü (precision-scale = 41) 32'den büyük. Bu durum çarpma kurallarındaki üçüncü durumdur ve sonuç türü ondalık (38, 6)'dır.

Ayrıca bakınız