2016-01-24 23 views
0

下面是我創建的過程。當我單獨運行查詢時,我在數據庫中查找記錄,但是當我執行該過程時,它不會獲取任何記錄。我哪裏錯了?SQL過程不顯示任何值

ALTER PROCEDURE [dbo].[GetTransferList] 

@date1 datetime='2015-01-01 00:00:00.000', 
@date2 datetime='2017-01-01 00:00:00.000', 
@shipto varchar(50)='' 

AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 

    -- Insert statements for procedure here 
    DECLARE 
     @sql  NVARCHAR(MAX),         
     @paramlist NVARCHAR(4000),        
     @nl   CHAR(2) = CHAR(13) + CHAR(10), 
     @ParamDefinition NVarchar(2000); 

    SET @sql = 'SELECT A.ItemDescription,A.PurchaseOrderID,A.QuantityReceived,A.Price,A.StoreID, 
      C.ItemType,C.BinLocation, 
      B.PONumber,B.ShipTo,B.StoreID 
      FROM [dbo].[PurchaseOrderEntry] A, [dbo].[PurchaseOrder] B,[dbo].[Item] C 
      WHERE A.PurchaseOrderID=B.ID AND A.ItemID=C.ID '; 

    IF (@date1 IS NOT NULL) AND (@date2 IS NOT NULL )           
     SET @sql += ' AND B.[RequiredDate] between @date1 AND @date2'; 

    IF @shipto IS NOT NULL --!='ALL'            
     SET @sql += ' AND B.ShipTo = @shipto '; 

    SET @sql += ' GROUP BY C.BinLocation,A.Price,C.ItemType, B.ID ,A.ItemDescription, 
      A.PurchaseOrderID,A.QuantityReceived,A.StoreID,B.PONumber,B.ShipTo,B.StoreID' 

    Set @ParamDefinition =' @shipto varchar(50), 
      @date1 datetime, 
      @date2 datetime' 

    Execute sp_Executesql  @sql, 
          @ParamDefinition, 
          @shipto, 
          @date1, 
          @date2 

    If @@ERROR <> 0 GoTo ErrorHandler 
     Set NoCount OFF 
    Return(0) 

    ErrorHandler: 
    Return(@@ERROR) 
END 

查詢取值低於,

SELECT A.ItemDescription,A.PurchaseOrderID,A.QuantityReceived,A.Price,A.StoreID, 
      C.ItemType,C.BinLocation, 
      B.PONumber,B.ShipTo,B.StoreID 
FROM [dbo].[PurchaseOrderEntry] A, [dbo].[PurchaseOrder] B,[dbo].[Item] C 
WHERE A.PurchaseOrderID=B.ID AND A.ItemID=C.ID 
GROUP BY C.BinLocation,A.Price,C.ItemType, B.ID ,A.ItemDescription, 
      A.PurchaseOrderID,A.QuantityReceived,A.StoreID,B.PONumber,B.ShipTo,B.StoreID 
+0

你將什麼傳遞到存儲過程? (你的分組在提取查詢中是不同的)你爲什麼分組? – Fred

+0

我修改了第二個查詢,以前我複製了一個錯誤的,現在可以找到我出錯的地方了嗎?理想情況下,當我使用過程中沒有輸入運行時,它應該給出第二個查詢的相同結果.. – Jobin

+0

您確定這是您正在運行的SQL嗎?你已經初始化了@shipto varchar(50)=''',這樣它將被添加到SQL中,因爲它不是NULL。 –

回答

0

我堅信,您的日期參數不與現有記錄匹配的,因爲這工作正常出方的程序沒有日期查詢條件。

如果前端是C#(不確定其他前端代碼),則proc中的Date參數將標記爲默認值 。

  1. 日期參數將與最小日期值或傳遞
  2. 如果你沒有在前端代碼

但兩者的情況下日期參數將添加日期參數

  • Null值將被傳遞有一些日期值。 將日期值分配給工作查詢作爲條件並進行檢查。

    正如Mr.Fred所問,在您的查詢中進行分組可能不是必需的,除非您打算擁有任何聚合字段。

  • 1

    我懷疑你最大的問題是@shipto varchar(50)=''。在你的PROC你再測試null

    所以這條線....

    IF @shipto IS NOT NULL 
    

    如果你沒有通過任何東西會等於一個空字符串(除非你確實傳遞不會是真的在null值)

    更改爲:

    @shipto varchar(50) = null 
    

    然後你就可以測試null,你正在做的和該C ode

    IF @shipto IS NOT NULL --!='ALL'            
        SET @sql += ' AND B.ShipTo = @shipto '; 
    

    如果您不提供此參數,則測試結果爲true。

    如果您想添加AND B.ShipTo = '',只需將值傳遞給@shipto參數即可。

    然而,這一點並不需要是動態的,因爲這將做同樣的事情

    b.shipto = Coalesce(@shipto, B.ShipTo)

    這同樣適用於您的日期參數。如果你真的傳入一個空值,他們將只會是null

    由於您沒有聚合功能,如SUMMAXCOUNT等您不需要羣組。

    所以我個人的偏好是...

    ALTER PROCEDURE [dbo].[GetTransferList] 
    
    @date1 datetime=null, 
    @date2 datetime=null, 
    @shipto varchar(50) = null 
    --This will make your parameters optional. IE. You dont have to provide them when you call it 
    AS 
    BEGIN 
        -- SET NOCOUNT ON added to prevent extra result sets from 
        -- interfering with SELECT statements. 
    
        IF(@date1 IS NULL) SET @date1 = cast('1899-1-1' as datetime) --This could be anytime in the past thatis prior to any records you hold 
        IF(@date2 IS NULL) SET @date2 = cast('2100-1-1' as datetime) -- A date well in the future 
        --You could also set directly as the default values for the parameter but if you do you will have a problem if `null` is passed in. 
    
        SELECT A.ItemDescription,A.PurchaseOrderID,A.QuantityReceived,A.Price,A.StoreID, 
          C.ItemType,C.BinLocation, 
          B.PONumber,B.ShipTo,B.StoreID 
          FROM [dbo].[PurchaseOrderEntry] A, [dbo].[PurchaseOrder] B,[dbo].[Item] C 
          WHERE A.PurchaseOrderID=B.ID AND A.ItemID=C.ID AND B.[RequiredDate] between @date1 AND @date2 
          AND B.ShipTo = COALESCE(@shipto, b.ShipTo) 
    
    
    
        If @@ERROR <> 0 GoTo ErrorHandler 
         Set NoCount OFF 
        Return(0) 
    
        ErrorHandler: 
        Return(@@ERROR) 
    END 
    

    現在你可以提供一個日期(日期後,返回到一個日期的所有記錄或所有記錄)或兩個日期(返回所有記錄日期間),不提供任何一飽眼福。 @shipto也一樣。