存储过程通过搜索功能返回具有给定首字母的名称

时间:2011-11-18 12:24:24

标签: c# sql search

首先尝试这样的查询

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什么都没显示。有任何想法吗?谢谢!

5 个答案:

答案 0 :(得分:3)

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

您需要删除引号:

WHERE LEFT(NAME, 1) = @SearchTerm

此外,您可能会或可能不会意识到您可以使用LIKE

实现此目的
WHERE NAME LIKE 'A%'

...或

WHERE NAME LIKE @SearchTerm + '%'

...... %是通配符。通过这种方式,传递A将搜索以字母A开头的任何内容,但是传递ABC将搜索带有字母“ABC”的任何内容,而无需指定长度,如LEFT中所示。 1}}功能。

<强>更新
此外,您似乎错误地将参数传递给过程:

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

在这里,您正在查找QueryString集合中的一个键,匹配您选择的值。因此,如果DropDownList1.SelectedValue.ToString()产生“A”,它将会寻找?A=...。您可能希望使用以下内容:

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

答案 1 :(得分:0)

试试这个......

LEFT(NAME, 1) = @SearchTerm 

而不是

LEFT(NAME, 1) = '@SearchTerm' 

答案 2 :(得分:0)

正如我在你的问题评论中提到的那样,不考虑搜索词的长度可能是你遇到的问题,但是其他人也提出了另一个使用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()]);

Request.QueryString [value]将为您提供Request.QueryString [value]等于的任何内容。我想你真的想要这个吗?

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

答案 3 :(得分:0)

如果你只想匹配第一个字符,你的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表的主键,但为了简洁起见,我将其省略。

答案 4 :(得分:0)

您是否在Page_Load-Event中填写了DropDownList?

如果是,请在

中验证是否发生了这种情况
if (!Page.IsPostback)
{
}

块。

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