2011-09-25 49 views
0

我有一个计算列的视图,现在我需要强制计算列为“not null”用于lightswitch。在视图中定义一个计算列为非空

我试图cast(),但我仍然不能得到计算列是“not null” 这可能吗?

这是我的SQL:

SELECT dbo.Nop_Manufacturer.Name, 
     CAST(SUM(dbo.Nop_OrderProductVariant.PriceExclTax) AS INT)   AS 
     SALES, 
     CAST(MONTH(dbo.Nop_Order.PaidDate) AS INT)       AS 
     paid_month, 
     CAST(YEAR(dbo.Nop_Order.PaidDate) AS INT)       AS 
     paid_year, 
     CAST(COUNT(dbo.Nop_OrderProductVariant.OrderProductVariantID) AS INT)AS 
     num_prod_sold 
FROM dbo.Nop_ProductVariant 
     INNER JOIN dbo.Nop_OrderProductVariant 
     ON dbo.Nop_ProductVariant.ProductVariantId = 
      dbo.Nop_OrderProductVariant.ProductVariantID 
     INNER JOIN dbo.Nop_Product 
     ON dbo.Nop_ProductVariant.ProductID = dbo.Nop_Product.ProductId 
     INNER JOIN dbo.Nop_Product_Manufacturer_Mapping 
        INNER JOIN dbo.Nop_Manufacturer 
        ON dbo.Nop_Product_Manufacturer_Mapping.ManufacturerID = 
         dbo.Nop_Manufacturer.ManufacturerID 
     ON dbo.Nop_Product.ProductId = 
      dbo.Nop_Product_Manufacturer_Mapping.ProductID 
     INNER JOIN dbo.Nop_Order 
     ON dbo.Nop_OrderProductVariant.OrderID = dbo.Nop_Order.OrderID 
WHERE (NOT (dbo.Nop_Order.PaidDate IS NULL)) 
GROUP BY dbo.Nop_Manufacturer.Name, 
      MONTH(dbo.Nop_Order.PaidDate), 
      YEAR(dbo.Nop_Order.PaidDate) 

回答

3

CAST -ing作为INT不会做任何事情影响到计算列的感知为空。你需要用ISNULL来代替它们。

例如ISNULL(YEAR(dbo.Nop_Order.PaidDate),0)

这在last paragraph here

是记录在数据库引擎自动确定基于所使用的表达式 计算列的为空。大多数 表达式的结果即使仅存在不可空列 ,也被视为可以为空,因为可能的下溢或溢出也会产生 空结果。使用COLUMNPROPERTY函数和 AllowsNull属性来调查表中任何计算的 列的可空性。可以为空的表达式可以通过指定ISNULL(check_expression, constant), 变成 不可空的表达式,其中常量是一个非空值,用于替换任何空结果。

+0

非常好,我一直在努力寻找同样的东西。我正在使用我最喜欢的COALESCE,但只有ISNULL将列设置为NOT NULL,至少在表中。感谢分享。 –