2011-11-30 71 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