存储过程通过Search函数返回具有给定首字母的名称

本文关键字:Search 函数 返回 存储过程 | 更新日期: 2023-09-27 18:15:00

先尝试如下查询

SELECT *
FROM CUSTOMER
WHERE LEFT(NAME, 1) = 'A'

工作得很好,但现在我希望它作为一个存储过程和' a '被替换为这样的搜索词

CREATE PROCEDURE [dbo].[procCustomer_SelectByFirstLetter]
    @SearchTerm VARCHAR(50)
AS
SELECT  [Name]
FROM    [dbo].[Customer]
WHERE   LEFT(NAME, 1) = '@SearchTerm'
GO

这个存储过程是由一个c#方法调用的,该方法使用一个包含所有字母a - z

的下拉列表。
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
        {

            DataTable customerTable =  Customer.SelectByFirstLetter(Request.QueryString[DropDownList1.SelectedValue.ToString()]);
            CustomerRepeater.DataSource = customerTable;
            CustomerRepeater.DataBind();
            CustomerCountLabel.Text = customerTable.Rows.Count.ToString();            
    }

当我从下拉菜单中选择一个字母时,Reapter什么也没有显示。什么好主意吗?谢谢!

存储过程通过Search函数返回具有给定首字母的名称

您仍然使用引号值,因此它会查找第一个字母等于字符串"@SearchTerm"的名称,当然没有任何东西会这样。

你需要去掉引号:

WHERE LEFT(NAME, 1) = @SearchTerm

另外,您可能知道,也可能不知道,您可以使用LIKE:

实现这一点。
WHERE NAME LIKE 'A%'

…或者

WHERE NAME LIKE @SearchTerm + '%'

…其中%是通配符的任何东西。通过这种方式,传递A将搜索任何以字母A开头的内容,但传递ABC将搜索任何以字母"ABC"开头的内容,而不必指定长度,就像在LEFT函数中一样。


此外,您似乎错误地将参数传递给过程:

DataTable customerTable = Customer.SelectByFirstLetter(Request.QueryString[DropDownList1.SelectedValue.ToString()]);

在这里,您正在QueryString集合中寻找与所选值匹配的键。因此,如果DropDownList1.SelectedValue.ToString()产生"A",它将寻找?A=...。您可能希望使用以下方式:

DataTable customerTable = Customer.SelectByFirstLetter(DropDownList1.SelectedValue.ToString());

try this…

LEFT(NAME, 1) = @SearchTerm 

代替

LEFT(NAME, 1) = '@SearchTerm' 

如果你只想匹配第一个字符,你的SP应该是这样的

CREATE PROCEDURE [dbo].[procCustomer_SelectByFirstLetter]
    @SearchTerm CHAR(1)  
AS  
    SELECT 
              [Name]
        FROM    
              [dbo].[Customer]  
        WHERE   
              LEFT(NAME, 1) = @SearchTerm
GO

一般来说,你可以写

CREATE PROCEDURE [dbo].[procCustomer_SelectByNameStart]
    @SearchTerm VARCHAR(MAX) /*Use your column width here*/
AS  
    SELECT 
              [Name]
        FROM    
              [dbo].[Customer] C
        WHERE   
              C.[Name] LIKE @SearchTerm + '%'
GO

您可能还想在结果集中包含Customer表的主键,但为了简洁起见,我假设省略了这一点。

是否在Page_Load-Event中填充下拉列表?

如果是,请验证这是否发生在

if (!Page.IsPostback)
{
}

Page_Load在SelectedIndex_Changed事件之前执行,因此,如果您没有正确绑定下拉菜单,将下拉菜单的值重置为初始值,而不是您的搜索词

正如我在你的问题的评论中提到的,不考虑搜索词的长度可能是你遇到的问题,但也有人建议使用另一种好方法,使用like而不是left。

CREATE PROCEDURE [dbo].[procCustomer_SelectByFirstLetter]
    @SearchTerm VARCHAR(50)
AS
SELECT  [Name]
FROM    [dbo].[Customer]
WHERE   LEFT(NAME, LEN(@SearchTerm)) = @SearchTerm

话虽如此,但进一步审查,很可能这一行是您的问题:

Customer.SelectByFirstLetter(Request.QueryString[DropDownList1.SelectedValue.ToString()]);

请求。QueryString[value]会给你任何请求。QueryString[value]等于。我觉得你真的想要这个?

Customer.SelectByFirstLetter(DropDownList1.SelectedValue.ToString());