以下是我的.aspx代码
<asp:SqlDataSource ID="sdsVisitors" runat="server" ConnectionString="<%$ ConnectionStrings:ApplicationServices %>"
SelectCommand="Visitors_Select_All" SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:ControlParameter ControlID="txtVisitorID" DbType="Int32" Name="VisitorID" PropertyName="Text" DefaultValue="0" />
<asp:ControlParameter ControlID="txtName" Name="FirstName" PropertyName="Text" ConvertEmptyStringToNull="true"
DefaultValue="%" />
<asp:ControlParameter ControlID="ddlFloor" Name="Floor" PropertyName="SelectedValue"
ConvertEmptyStringToNull="true" DefaultValue="%" />
<asp:ControlParameter ControlID="ddlLocation" Name="Location" PropertyName="SelectedValue"
ConvertEmptyStringToNull="true" DefaultValue="%" />
<asp:ControlParameter ControlID="ddlEmployee" DbType="Int32" Name="EmployeeID" PropertyName="SelectedValue"
DefaultValue="0" />
<asp:ControlParameter ControlID="txtMobile" Name="Mobile" PropertyName="Text"
ConvertEmptyStringToNull="true" DefaultValue="%" />
<asp:ControlParameter ControlID="txtFromDate" Name="FromDate" PropertyName="Text"
ConvertEmptyStringToNull="true" DefaultValue="%" />
</SelectParameters>
</asp:SqlDataSource>
我的商店程序是
ALTER PROCEDURE [dbo].[Visitors_Select_All]
@VisitorID INT = 0 ,
@FirstName VARCHAR(30) = '' ,
@LastName VARCHAR(30) = '' ,
@City VARCHAR(30) = '' ,
@Floor VARCHAR(50) = '' ,
@Location VARCHAR(50) = '' ,
@Mobile VARCHAR(13) = '' ,
@EmployeeID INT = 0 ,
@FromDate VARCHAR(100) = ''
AS
BEGIN
SELECT V.[VisitorID] ,
V.[FirstName] ,
V.[MiddleName] ,
V.[LastName] ,
V.[Gender] ,
V.[Age] ,
V.[DetailWithMaterials] ,
V.[City] ,
V.[State] ,
V.[PinCode] ,
V.[Phone] ,
V.[Mobile] ,
V.[Date] ,
V.Location ,
E.Email
FROM [dbo].[Visitors] AS V
LEFT OUTER JOIN [dbo].[Employees] AS E ON V.EmployeeID = E.EmployeeID
WHERE V.FirstName LIKE @FirstName + '%'
AND V.LastName LIKE @LastName + '%'
AND V.City LIKE @City + '%'
AND V.[Floor] LIKE @Floor + '%'
AND V.Location LIKE @Location + '%'
AND V.Mobile LIKE @Mobile + '%'
AND ( ( @VisitorID <> 0
AND V.VisitorID = @VisitorID
)
OR ( @VisitorID = 0 )
)
AND ( ( @EmployeeID <> 0
AND V.EmployeeID = @EmployeeID
)
OR ( @EmployeeID = 0 )
)
AND ( ( CONVERT(VARCHAR(20), V.Date, 103) = @FromDate )
OR ( @FromDate = '' )
)
ORDER BY Date DESC
END
现在我想要的是如果我没有传递任何参数值,那么所有记录都应该返回,当我通过@FromDate
时,那个日期的记录应该返回。但现在这不起作用。如果我删除@FromDate
条件,那么它正在运行。任何帮助,将不胜感激。谢谢。
答案 0 :(得分:0)
根据您的代码,我怀疑问题可能是其中之一:
@FromDate
具有时间组件或格式错误。 CONVERT(VARCHAR(20), V.Date, 103)
会返回日期&#39; 1/4/13&#39; (2013年4月1日)作为&#39; 01/04 / 2013&#39;,四位数年份和领先零。因此,如果从@FromDate
传入的内容与此不完全匹配,则您无法获得匹配。
参数@FromDate
的名称暗示这只是日期范围的开头,但您的比较是完全匹配的。因此,除非您的v.Date
记录与@FromDate
完全相同,否则您将无法获得任何记录。
即使修复了上述问题,您也会进行字符串比较,而不是日期比较,因此查找v.Date
晚于@FromDate
的记录会产生问题,因为&# 39; 02/01/2012&#39;将会是&#34;之后&#34;那&#39; 01/04 / 2013&#39;。你会得到一个随机出现的记录混搭。
如果您在进行比较之前将@FromDate
转换为某个日期,所有这些都会消失:
DECLARE @fromDateAsDate date
IF @FromDate = ''
SET @fromDateAsDate = NULL
ELSE
SET @fromDateAsDate = CONVERT(date, @FromDate)
SELECT ...
FROM ...
WHERE (v.Date >= @FromDateasDate or @FromDateAsDate IS NULL)
你也会获得更好的表现:MikkaRin完全正确。这不是因为转换类型很昂贵(尽管可能是这样),因为如果被比较的索引中的字段是内部表达式(如转换),则查询引擎无法根据索引进行优化比他们使用的jut。