2011-11-25 74 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

听起来像是一个基于他的描述的存储过程。但是,他可以在管理工作室运行它,并获得相同的结果,无论它是否存储过程。只需确保你真的*运行相同的查询,通过遍历代码并获取发送的实际查询,而不是您认为应该发送的查询。 –

相关问题