2011-05-17 18 views
5

Ben boş olmayan "nicelik" (ondalık) ve "durum" (int) sütunları ile bir ürün tablosunu var ve şu vaka ifade ile bu masada bir görünüm yarattı:SQL görünümü boş olmayan bir tablonun null sütununu açar?

SELECT P.ProductTypeId, 
     (CASE WHEN P.StatusId IN (5, 8) THEN 0 ELSE -P.Quantity END) AS Quantity, 
     ... 
FROM Product P 

ProductTypeId doğru olduğunu sıfır olmayan olarak çıkar. Ancak, bu görüntünün Miktar sütunu, altta yatan sütunlar null olmamasına rağmen null olarak anılır. Bu bana hiç mantıklı gelmiyor.

Bu durumda varsayılan bir değer sağlamak için ISNULL/COALESCE'i kullanabilir ve null yapamayabilirliği zorlar, ancak anlamlı bir varsayılan değer yoktur ve bu benim anladığım kadarıyla ilk sırada olmamalıdır. Herhangi bir fikir neler oluyor?

cevap

6

Aşağıdaki açıklama bir tabloda computed columns içindir. Aynı şey, bir görünümde hesaplanan sütunlar için de geçerlidir.

Veritabanı Altyapısı otomatik kullanılan ifadelere göre hesaplanan sütun nullability belirler. en ifadelerin sonucu sadece nonnullable sütunlar olası underflows veya taşmaları iyi olarak boş sonuçlar üretecek çünkü mevcut olsa bile null olarak kabul edilir. COLUMNPROPERTY işlevini, AllowsNull özelliği ile bir tabloda hesaplanmış sütunun null yapısını araştırın. olabilir olabilecek olan bir ifadesi sabit null sonuç için ikame edilmiş bir null olmayan bir değerdir ISNULL (check_expression, sabiti), belirten bir nonnullable dönüştü.

ifadeniz NULL

SET ARITHABORT OFF; 
SET ANSI_WARNINGS OFF; 

WITH Product(Quantity,StatusId) As 
(
SELECT -2147483648,1 
) 
SELECT (CASE WHEN P.StatusId IN (5, 8) THEN 0 ELSE -P.Quantity END) AS Quantity 
FROM Product P 
+0

Ve bu taşma durumda imkansız olduğunu belirtmek için hiçbir yolu yoktur geri dönebilirler bir örnek? – naasking