使用存储过程进行多字段搜索

时间:2018-03-15 14:40:33

标签: c# sql-server winforms search stored-procedures

我的表中有24个字段,所有字段都是nvarchar类型,除了int类型之一,现在是ID我想在所有字段中搜索用户在textBox中写入的任何文本,例如,如果用户将写入& #34; 20"然后在textBox中,它应该显示其字段具有的所有记录" 20" ..我已经编写了一个存储过程,但只要我写了表格字段中存在的任何内容,它就无法正常工作,它不会在数据网格视图中返回任何内容!!
这是我的存储过程:

create proc searchClientProfile
@search nvarchar(255)
as
select * from clientProfile where convert(nvarchar,ID)+compName+Addres+compPhone+compEmail+compWebsite+shipAddress+shipPhone+primeContact+primePhone+primeEmail+secContact+secPhone+secEmail+sector+established+industry+anulPrch+country+region+town+stat+city+zip like '%@search%'

这是我的textBox TextChanged事件中的代码:

cmd = new SqlCommand("searchClientProfile", cn);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter[] parm = new SqlParameter[1];
parm[0] = new SqlParameter("@search", SqlDbType.NVarChar, 255);
parm[0].Value = searchClientTxt.Text.Trim();
cmd.Parameters.AddRange(parm);
da = new SqlDataAdapter(cmd);
da.Fill(getSearchedClientProfiles);
searchClientsDgv.DataSource = getSearchedClientProfiles;

4 个答案:

答案 0 :(得分:1)

如果我理解正确,您想检查20列中是否包含您的搜索查询。看起来应该是这样的:

select * 
from clientProfile 
where convert(nvarchar,ID) like '%@search%'
OR compName like '% ' + @search + '%'
OR Addres like '%'+@search + '%'
OR compPhone like '%'+@search + '%'
OR compEmail like '%'+@search + '%'
OR compWebsite like '%'+@search + '%'
OR shipAddress like '%'+@search + '%'
OR shipPhone like '%'+@search + '%'
OR primeContact like '%'+@search + '%'
OR primePhone like '%'+@search + '%'
OR primeEmail like '%'+@search + '%'
OR secContact like '%'+@search + '%'
OR secPhone like '%'+@search + '%'
OR secEmail like '%'+@search + '%'
OR sector like '%'+@search + '%'
OR established like '%'+@search + '%'
OR industry like '%'+@search + '%'
OR anulPrch like '%'+@search + '%'
OR country like '%'+@search + '%'
OR region like '%'+@search + '%'
OR town like '%'+@search + '%'
OR stat like '%'+@search + '%'
OR city like '%'+@search + '%'
OR zip like '%'+@search + '%'

我不知道你是如何构建你的应用程序的,但在那种查询中表现并不令人惊讶

答案 1 :(得分:1)

另一种选择(显然不是sargable)。

注意:需要ALIAS。

示例

date

答案 2 :(得分:0)

在连接中,您应该处理NULL个值。可以使用ISNULLCONCAT完成此操作。

另外,如果您ecContactsecPhone相应地search,该怎么办?您将它们连接为search并匹配。您需要使用分隔符。

如果我是你,我会写下条件的条件检查。

create proc searchClientProfile
' + @search + ' nvarchar(255)
as
select * from clientProfile where convert(nvarchar,ID) like '%' + @search + '%' OR compName like '%' + @search + '%' OR Addres like '%' + @search + '%' OR compPhone like '%' + @search + '%' OR compEmail like '%' + @search + '%' OR compWebsite like '%' + @search + '%' OR shipAddress like '%' + @search + '%' OR shipPhone like '%' + @search + '%' OR primeContact like '%' + @search + '%' OR primePhone like '%' + @search + '%' OR primeEmail like '%' + @search + '%' OR secContact like '%' + @search + '%' OR secPhone like '%' + @search + '%' OR secEmail like '%' + @search + '%' OR sector like '%' + @search + '%' OR established like '%' + @search + '%' OR industry like '%' + @search + '%' OR anulPrch like '%' + @search + '%' OR country like '%' + @search + '%' OR region like '%' + @search + '%' OR town like '%' + @search + '%' OR stat like '%' + @search + '%' OR city like '%' + @search + '%' OR zip like '%' + @search + '%'

答案 3 :(得分:0)

非常感谢你们的帮助...形成了我看到的答案我在我的C#代码中改变了我的存储过程特别是从'%@ search%'到'%'+ @ search +'%'的类似部分我已经向TextChanged事件添加了一行代码,用于清除数据网格视图的先前内容,因此现在TextChanged事件的代码如下所示:

getSearchedClientProfiles.Clear();
cmd = new SqlCommand("searchClientProfile", cn);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter[] parm = new SqlParameter[1];
parm[0] = new SqlParameter("@search", SqlDbType.NVarChar, 255);
parm[0].Value = searchClientTxt.Text.Trim();
cmd.Parameters.AddRange(parm);
da = new SqlDataAdapter(cmd);
da.Fill(getSearchedClientProfiles);
searchClientsDgv.DataSource = getSearchedClientProfiles;