存储过程通过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什么也没有显示。什么好主意吗?谢谢!
您仍然使用引号值,因此它会查找第一个字母等于字符串"@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());