我有一个包含以下选项的下拉列表:
<asp:DropDownList ID="ddlTaxStatus" runat="server" OnPreRender="ddlContainerStatus_PreRender">
<asp:ListItem Text="--Select--" Value="-1"></asp:ListItem>
<asp:ListItem Value="" Text="'' - Not closed"></asp:ListItem>
<asp:ListItem Value="R" Text="R - Ready to pay"></asp:ListItem>
<asp:ListItem Value="X" Text="X - Paid"></asp:ListItem>
<asp:ListItem Value="C" Text="C - Cancel"></asp:ListItem>
<asp:ListItem Value="O" Text="O - Original"></asp:ListItem>
<asp:ListItem Value="D" Text="D - Delete"></asp:ListItem>
</asp:DropDownList>
根据用户选择的选项,我在我的数据库中发送所选的搜索选项,并检索在相关字段中具有所选值的记录。我的Sql usp看起来像这样:
ALTER PROCEDURE [dbo].[uspGetContainerSummaryRecordsForSearch] (
@fkJobID varchar(8),
@csmTaxStatus varchar(3)
)
AS
BEGIN
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
SET NOCOUNT ON;
SELECT fkJobID,
csmContainerID,
csmDisplayContainerID,
csmTaxStatus
FROM ContainerSummaryRecord
where fkJobID = @fkJobID
AND ( @csmTaxStatus IS NULL
OR csmTaxStatus = @csmTaxStatus )
END
现在我的问题是,当用户选择Value =“”和Text =“'' - 未关闭”的选项时,我没有得到所需的结果。这是因为value =“”实际上在DB中存储为null。 在查询中我比较where子句中的输入参数,如@csmTaxStatus IS NULL 因为如果用户没有选择含义Text =“ - Select--”Value =“ - 1”的任何选项,则不应用过滤器并返回所有结果(这是此选项的所需行为)。但这与在数据库中存储为null的Value =“”发生冲突。请帮助。
答案 0 :(得分:1)
将条件更改为
只需使用isnull()
即可轻松解决问题,将空格替换为空白,如下所示
where fkJobID = @fkJobID
AND ( @csmTaxStatus IS NULL
OR isnull(csmTaxStatus,'') = @csmTaxStatus )
答案 1 :(得分:0)
有几种方法可以解决这个问题,但您可以更改SQL语句以处理csmTaxStatus中的NULL并将其转换为空字符串。如果您将@csmTaxStatus作为空字符串传递,那么您可以使用ISNULL。
ISNULL( csmTaxStatus, '' ) = @csmTaxStatus
完整的SQL语句
SELECT fkJobID,
csmContainerID,
csmDisplayContainerID,
csmTaxStatus
FROM
ContainerSummaryRecord
WHERE
fkJobID = @fkJobID
AND ISNULL( csmTaxStatus, '' ) = @csmTaxStatus