Hatalar ve uyarılar sorgu ifadelerini temel sorun giderme
Bazı durumlarda, SQL Server 2008 Sorgulardaki İfadeler değerlendirilen sooner çok SQL Server 2000.Bu davranış aşağıdaki önemli yararları sağlar:
Dizinler üzerinde hesaplanan sütunlar için hesaplanan sütun ifade aynıdır bir sorgu ifadelerde eşleştirilir.
Yedek hesaplamasını ifade sonuçlar engellenir.
Ancak, niteliğine bağlı olarak, sorgu ve veritabanındaki veriler, çalışma -saat özel durumlar ortaya SQL Server 2008 , sorguyu var. bir varolan güvensiz ifadeBu çalışma -saat özel durumlar aşağıda belirtilmiştir:
Aritmetik özel durumlar: sıfıra bölme, taşma ve Yetersizlik durumu.
Dönüştürme hataları duyarlık ve sayısal dize sayıya dönüştürmek denemesi kaybı gibi.
Toplama üzerinden bir küme değerlerin tümünü geçirecektir olduğu garanti değildir.
De SQL Server 2000, aşağıdaki özel durumlar dışında değil ortaya çıkabilecek bir uygulamasında belirli kullanan belirli veri.Ancak, istatistikleri potansiyel değiştirilmesi için değiştirilmiş bir sorgu planı içinde özel durum neden olabilir SQL Server 2008.Bu çalışma - engelleyebilirsinizsaat NULLIF veya büyük/küçük harf gibi koşullu ifadeler dahil etmek için sorgu değiştirerek özel durum.
Önemli |
|---|
Expressions that appear in a search condition, select list, or any other location within a query may be broken down and reorganized into one or more independent expressions.SQL Server may evaluate these independent expressions in any order with respect to each other.Birleşimler, dahil olmak üzere, filtre işlemleri sonucu sütunlara hesaplanan önce mutlaka uygulanmaz. |
Aşağıdaki örnekte, ifade x/y seçme listesinde tüm Değerlendirilmiş olabilir saat, hatta sonuçta için sorgu. çıktı olarak geçerli olmayan satırlar için
USE tempdb
GO
IF OBJECT_ID('T','U') IS NOT NULL
DROP TABLE T
IF OBJECT_ID('S','U') IS NOT NULL
DROP TABLE S
GO
CREATE TABLE T(x float, y float, z nvarchar(30))
CREATE TABLE S(a float, b float)
GO
INSERT INTO T VALUES (1, 0, 'unknown')
INSERT INTO T VALUES(1, 2, '10')
GO
INSERT INTO S VALUES (1, 1)
INSERT INTO S VALUES (1, 2)
INSERT INTO S VALUES (1, 3)
INSERT INTO S VALUES (1, 4)
INSERT INTO S VALUES (1, 5)
Aşağıdaki sorgu başarısız SQL Server 2008 , ancak içinde tamamlanmadan SQL Server 2000.
SELECT x/y FROM T INNER JOIN S ON x = a AND y > b
OPTION(HASH JOIN)
Sorgu başarısız olur çünkü x/y ifade bir sıfıra bölme hatası ifade değerlendirilmesi için neden olan y=0.
Aşağıdaki kod yürütmek doğru sorgu sağlayan bir çözümdür:
SELECT x/NULLIF(y,0) FROM T INNER JOIN S ON x = a AND y > b
OPTION(HASH JOIN)
ifade NULLIF(y,0) verir NULL , y = 0.Aksi halde, ifade için değer döndürür y.ifade x/NULL ortaya çıkarır NULL ve hiçbir özel durum oluşur.
Karakter verileri sayısal türleri için dönüştürme ile ilgili aşağıdaki örneğe bakın.
SELECT CONVERT(tinyint, z) FROM T INNER JOIN S ON x = a AND y > b
OPTION(HASH JOIN)
Sorgu dönüştürmek sorgu çalıştığında bir dönüşüm hatası ile başarısız olur dize 'unknown' için bir tinyint.Bu sorunu çözmenin bir yolu ise yalnızca Eğer dönüştürme gerçekleştirmek için sorguyu değiştirmek için z olan numeric, tanıtımı tarafından bir CASE deyim gibi:
SELECT CASE WHEN ISNUMERIC(z) = 1
THEN CONVERT(tinyint, z)
ELSE 0
END
FROM T INNER JOIN S ON x = a AND y > b
OPTION(HASH JOIN)
Özel dize değeri kullanarak forgo için ikinci bir çözüm olan 'unknown' veritabanı ve kullanımı NULL bunun yerine.Türünü değiştirmek için üçüncü bir çözüm olan z için sütun tinyint dönüştürme tamamen önlemek için.Bu gibi çözümleri veri ve şema değişiklikleri, sırasıyla gerektirdiğinden, bu çözümlerin uygulanması sorguyu değiştirme'den daha fazla çalışma gerektirebilir.Ancak, bunlar da diğer sorguları yazma kolaylaştırmak, çözümlerin düşünün isteyebilirsiniz.
Toplama işlevleri tarafından verilen boş giriş uyarısı
En az gibi toplama işlevleri bir uyarı vermek onların giriş null değeri içeriyorsa, null değeri ortadan.Bu uyarı planı bağımlı olabilir.null girdiler için isterseniz toplu işlenecek ve verilen uyarı almak değil, yerel olarak null değerleri ortadan kaldırmak için sorguyu değiştirebilirsiniz.Göz önünde SELECT deyim aşağıdaki örnekte:
USE tempdb
GO
IF OBJECT_ID('newtitles','U') IS NOT NULL
....DROP TABLE newtitles
GO
CREATE TABLE dbo.newtitles
(title varchar (80) NULL ,
pubdate datetime NULL)
GO
INSERT dbo.newtitles VALUES('Title 1', NULL)
INSERT dbo.newtitles VALUES('Title 2', '20050311')
GO
SELECT t.title, t.pubdate, m.min_pubdate
FROM newtitles AS t,
(SELECT MIN(pubdate) AS min_pubdate
FROM newtitles) AS m
WHERE t.pubdate = m.min_pubdate
GO
De SQL Server 2008, bu sorgu üreten bir uyarı.Uyarı önlemek için bir koşul ekleyerek sorguyu değiştirin WHERE pubdate IS NOT NULL önce toplama null değerleri filtrelemek için:
SELECT t.title, t.pubdate, m.min_pubdate
FROM newtitles AS t,
(SELECT MIN(pubdate) AS min_pubdate
FROM newtitles
WHERE pubdate IS NOT NULL) AS m
WHERE t.pubdate = m.min_pubdate
GO
Önemli