在视图中将计算列定义为非null

时间:2011-09-25 17:25:20

标签: sql-server-2008 visual-studio-lightswitch

我有一个带有计算列的视图现在我需要强制计算列为lightswitch的“not null”。

我尝试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)  

1 个答案:

答案 0 :(得分:3)

CAST - 以INT为单位不会影响计算列的可感知空性。您需要将它们包装在ISNULL中。

e.g。 ISNULL(YEAR(dbo.Nop_Order.PaidDate),0)

last paragraph here

中记录了这一点
  

数据库引擎自动确定可空性   根据使用的表达式计算列。结果最多   即使只有不可为空的列,表达式也被认为是可空的   存在,因为可能会产生下溢或溢出   null结果也是如此。使用COLUMNPROPERTY功能   AllowsNull属性调查任何计算的可空性   表中的列。可以为空的表达式可以转换为   通过指定ISNULL(check_expression, constant),不可为空的,   其中常量是替换任何空结果的非空值。