2011-11-25 73 views
0

請考慮以下查詢。SQL查詢在Management Studio中工作,但不在程序中

SELECT  LP.project_id, LP.title, LP.type, LU.NAME, LP.reference, LP.status, LP.correspondence, LP.source, LP.deadline, LP.mstat, LP.num_pages, LP.done, 
         LP.ss_notes 
FROM   LogiCpsProjects AS LP LEFT OUTER JOIN 
         LogiCpsProjectAssignments AS LPA ON LP.project_id = LPA.project_id LEFT OUTER JOIN 
         LogiCpsUsers AS LU ON LPA.writer_id = LU.ID 
WHERE  (LP.status <> 'Closed') AND (LP.status <> 'Cancelled') AND (LP.type LIKE '%' + @type + '%') AND (LP.status LIKE '%' + @status + '%') AND 
         (LP.source LIKE '%' + @source + '%') AND (CAST(LP.mstat AS VARCHAR(50)) LIKE '%' + @mstat + '%') 
ORDER BY LP.project_id 

在此查詢我試圖開展了基於四個參數,即@type,@status,@source和@mstat搜索。問題是這個查詢與Sql Server Management Studio中應該完全相同,例如,如果我在類型參數中輸入'Article'並將其他項留空,那麼它將返回type ='Article'的所有記錄,如果我輸入type ='Article '和status ='Working',然後它返回所有類型爲'Article'和status ='Working'的記錄等等......簡單地說,搜索是動態的,因爲用戶可以輸入,將所有參數留空或者將值全部放入四。它在MS中工作正常,但在實際的程序中沒有。

我正在使用一個SqlDataSource,使用相同的查詢,如果我留下所有參數空白它不會返回任何東西,如果我輸入1參數它仍然不會返回任何東西,它只會返回記錄,如果我輸入所有四個參數意味着它沒有處理空白參數。發送參數我使用四個下拉列表。他們都看起來像這個。

 <asp:DropDownList ID="ddlStatus" runat="server" Width="220px"> 
<asp:ListItem Selected="True" Value="" Text="">All</asp:ListItem> 
<asp:ListItem>Details Pending</asp:ListItem> 
<asp:ListItem>Working</asp:ListItem> 
<asp:ListItem>Awaiting Feedback</asp:ListItem> 
<asp:ListItem>Project Complete (AFB)</asp:ListItem> 
<asp:ListItem>Revision Required Client</asp:ListItem> 
<asp:ListItem>Revision Required Editor</asp:ListItem> 
<asp:ListItem>To be Cancelled</asp:ListItem> 
<asp:ListItem>Cancelled</asp:ListItem> 
<asp:ListItem>Requirements Not Clear</asp:ListItem> 
<asp:ListItem>Hold</asp:ListItem> 
<asp:ListItem>Closed</asp:ListItem> 
    </asp:DropDownList> 

第一項被定義爲ALL和它具有的值和文本設置爲「」(空字符串),所以當用戶選擇全部這意味着該特定參數的所有記錄。

我做錯了什麼?

回答

1

注意是否爲所有參數發送空字符串或空字符串。如果您在管理工作室中運行sql語句「select'%'+ null +'%'」,您會發現結果爲null,這不是您要查找的內容。

+0

+1如果這是一個存儲過程,那麼你可以從SSMS調用它的空值,並看看你是否得到相同的結果。 –

+0

聽起來像是一個基於他的描述的存儲過程。但是,他可以在管理工作室運行它,並獲得相同的結果,無論它是否存儲過程。只需確保你真的*運行相同的查詢,通過遍歷代碼並獲取發送的實際查詢,而不是您認爲應該發送的查詢。 –

相關問題