2011-11-30 28 views
0

我有一个SQL Server视图:SQL Server视图会产生不同的结果集

SELECT SOPOrderReturn.DocumentNo, 
     StockItem.Code, 
     SLCustomerAccount.CustomerAccountNumber, 
     SOPOrderReturn.CustomerID, 
     SOPDocDelAddress.PostalName, 
     SOPDocDelAddress.AddressLine1, 
     SOPDocDelAddress.AddressLine2, 
     SOPDocDelAddress.AddressLine3, 
     SOPDocDelAddress.AddressLine4, 
     SOPDocDelAddress.PostCode, 
     SOPOrderReturnLine.LineQuantity, 
     SOPOrderReturn.PromisedDeliveryDate, 
     StockItem.SpareNumber2, 
     StockItem.SpareNumber3, 
     StockItem.Name, 
     StockItem.SpareText2, 
     StockItem.SpareText1, 
     StockItem.SpareNumber1 
FROM SOPOrderReturn 
     INNER JOIN SOPOrderReturnLine 
      ON SOPOrderReturn.SOPOrderReturnID = SOPOrderReturnLine.SOPOrderReturnID 
     INNER JOIN SOPDocDelAddress 
      ON SOPOrderReturn.SOPOrderReturnID = SOPDocDelAddress.SOPOrderReturnID 
     INNER JOIN SLCustomerAccount 
      ON SOPOrderReturn.CustomerID = SLCustomerAccount.SLCustomerAccountID 
     INNER JOIN StockItem 
      ON SOPOrderReturnLine.ItemCode = StockItem.Code 
WHERE (NOT (StockItem.Code LIKE '%DELIVERY%')) AND 
     (NOT (StockItem.Name LIKE '%DELIVERY%')) AND 
     (SOPOrderReturn.PromisedDeliveryDate > CURRENT_TIMESTAMP - 3) 

当所谓的 '是' 从.NET使用此查询:

SELECT [DocumentNo],[Code], 
     [CustomerAccountNumber], 
     [CustomerID],[PostalName], 
     [AddressLine1],[AddressLine2], 
     [AddressLine3],[AddressLine4], 
     [PostCode],[LineQuantity], 
     [PromisedDeliveryDate], 
     [SpareNumber2], 
     [SpareNumber3], 
     [Name], 
     [SpareText2], 
     [SpareText1], 
     [SpareNumber1] 
FROM [viwSalesOrdersRecent]; 

...一切都虎背熊腰,脚蹬多莉。它返回我期望看到的所有861行,这与SQL Server在视图中应该显示的内容相匹配。

然而,当我调用View(如上)与以下WHERE子句上涨了它:不要

WHERE [DocumentNo] = @prmSalesOrderNumber AND [Code] = @prmStockCode; 

查询返回的整个数据集,忽略了视图内现有Where子句,我不理解这种行为。我不熟悉SQL Server,3年没有触及过它,现在我已经深入了解它,完全超出了我的深度。

任何帮助将不胜感激。

+0

仔细检查你是否真的将'where'子句添加到视图中,你认为你是 – Andomar

+0

@Andomar:刚刚检查过,确定我删除了View并重新运行查询,因为它失败了找不到视图,所以我一定在看正确的视图。 – DrObey

+0

使用Profiler检查传递给查看的参数值。 – Kashif

回答

1

校验码最后,我从来没有解决了这个,所以我最终夹紧它向微软为他们看看。

他们已经初步确认这是由SQL Server中的一个错误引起的,他们希望在将来的更新中补救错误。

+0

这是在Microsoft Connect的某处吗? –

+0

@MartinSmith我没有线索,我没有自己记录,我用我的SQL Server经销商查询了这个问题,并且他们升级了它。 – DrObey

+0

如果您想将XML实际执行计划发布到某处,它应该显示出现问题的地方。 –

0

我建议你在视图中添加isnull以及在视图上查询。空值在很大程度上影响结果集。下面

 SELECT SOPOrderReturn.DocumentNo, 
       StockItem.Code, 
       SLCustomerAccount.CustomerAccountNumber, 
       SOPOrderReturn.CustomerID, 
       SOPDocDelAddress.PostalName, 
       SOPDocDelAddress.AddressLine1, 
       SOPDocDelAddress.AddressLine2, 
       SOPDocDelAddress.AddressLine3, 
       SOPDocDelAddress.AddressLine4, 
       SOPDocDelAddress.PostCode, 
       SOPOrderReturnLine.LineQuantity, 
       SOPOrderReturn.PromisedDeliveryDate, 
       StockItem.SpareNumber2, 
       StockItem.SpareNumber3, 
       StockItem.Name, 
       StockItem.SpareText2, 
       StockItem.SpareText1, 
       StockItem.SpareNumber1 
     FROM SOPOrderReturn 
       INNER JOIN SOPOrderReturnLine 
        ON SOPOrderReturn.SOPOrderReturnID = SOPOrderReturnLine.SOPOrderReturnID 
       INNER JOIN SOPDocDelAddress 
        ON SOPOrderReturn.SOPOrderReturnID = SOPDocDelAddress.SOPOrderReturnID 
       INNER JOIN SLCustomerAccount 
        ON SOPOrderReturn.CustomerID = SLCustomerAccount.SLCustomerAccountID 
       INNER JOIN StockItem 
        ON SOPOrderReturnLine.ItemCode = StockItem.Code 
     WHERE (NOT (isnull(StockItem.Code,'') LIKE '%DELIVERY%')) AND 
       (NOT (isnull(StockItem.Name,'') LIKE '%DELIVERY%')) AND 
       (SOPOrderReturn.PromisedDeliveryDate > CURRENT_TIMESTAMP - 3) 



     SELECT [DocumentNo],[Code], 
       [CustomerAccountNumber], 
       [CustomerID],[PostalName], 
       [AddressLine1],[AddressLine2], 
       [AddressLine3],[AddressLine4], 
       [PostCode],[LineQuantity], 
       [PromisedDeliveryDate], 
       [SpareNumber2], 
       [SpareNumber3], 
       [Name], 
       [SpareText2], 
       [SpareText1], 
       [SpareNumber1] 
     FROM [viwSalesOrdersRecent] 
     WHERE isnull([DocumentNo],'') = isnull(@prmSalesOrderNumber,'') 
     AND isnull([Code],'') = isnull(@prmStockCode,'') 
+0

只要把它放进去,恐怕就没有快乐了。 – DrObey

+0

只是告诉我在第一个查询中有多少记录以及第二个中有多少个 – sameer

+0

它目前在视图中是1013,但是使用额外的Where子句,它是113272 – DrObey