我有一个Windows窗体,用户可以在多个文本框中输入多个值,以获得更快的搜索结果。但是在运行时,它只需要第一个参数,即全名,而忽略另一个。不知道为什么会这样。我在结果中得到了我不想要的全部表格。我创建了一个存储过程。
CREATE PROCEDURE USP_SELECT_CUSTOMERS (
@fullName VARCHAR(100) = '',
@Address VARCHAR(100) = '',
@ContactNumber VARCHAR(15) = ''
)
AS BEGIN
SELECT * FROM Customers
WHERE ((ContactName LIKE @fullName+'%') OR (@fullName = ''))
OR ((Address LIKE @Address+'%') OR (@Address = ''))
OR ((Phone LIKE @ContactNumber+'%') OR (@ContactNumber = ''))
END
以下是我在程序中调用存储过程的方式:=>
private void btnSubmit_Click(object sender, EventArgs e)
{
try
{
con.Open();
SqlCommand cmd = new SqlCommand("USP_SELECT_CUSTOMERS", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@fullName", txtFullName.Text);
cmd.Parameters.AddWithValue("@Address", txtAddress.Text);
cmd.Parameters.AddWithValue("@ContactNumber", txtContactNumber.Text);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
if (ds.Tables[0].Rows.Count > 0)
{
dataGridView1.Visible = true;
dataGridView1.DataSource = ds.Tables[0];
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
finally
{
con.Close();
}
}
我想要的是即使1个文本框被填充,存储过程也应该给出所需的输出。请帮助我。
感谢。
答案 0 :(得分:1)
您应该AND
而不是OR
。试试这个:
CREATE PROCEDURE USP_SELECT_CUSTOMERS (
@fullName VARCHAR(100),
@Address VARCHAR(100),
@ContactNumber VARCHAR(15)
)
AS BEGIN
SELECT * FROM Customers
WHERE ((ContactName LIKE @fullName+'%') OR (@fullName = ''))
AND ((Address LIKE @Address+'%') OR (@Address = ''))
AND ((Phone LIKE @ContactNumber+'%') OR (@ContactNumber = ''))
END
它会给你想要的结果。
请参阅SQL Fiddle
修改强> 根据您的要求,使用此查询:
CREATE PROCEDURE USP_SELECT_CUSTOMERS
(
@fullName VARCHAR(100),
@Address VARCHAR(100),
@ContactNumber VARCHAR(15)
)
AS
BEGIN
IF LEN(@fullName)=0
SET @fullName='$$$'
IF LEN(@Address)=0
SET @Address='$$$'
IF LEN(@ContactNumber)=0
SET @ContactNumber='$$$'
SELECT * FROM Customers
WHERE ((ContactName LIKE @fullName+'%'))
OR ((Address LIKE @Address+'%'))
OR ((Phone LIKE @ContactNumber+'%'))
END
添加了一个简单的技巧。请参阅SQL Fiddle。
将$$$
替换为ContactName
,Address
和Phone
字段中包含 的任何内容。
答案 1 :(得分:0)
IMO,
这应该做
CREATE PROCEDURE USP_SELECT_CUSTOMERS (
@fullName VARCHAR(100) = '',
@Address VARCHAR(100) = '',
@ContactNumber VARCHAR(15) = ''
)
AS BEGIN
SELECT * FROM Customers
WHERE ((ContactName LIKE @fullName+'%') OR (@fullName = ''))
AND ((Address LIKE @Address+'%') OR (@Address = ''))
AND ((Phone LIKE @ContactNumber+'%') OR (@ContactNumber = ''))
END
使用northwind我得到跟随,命令 EXEC USP_SELECT_CUSTOMERS'maria','','
执行USP_SELECT_CUSTOMERS'maria','Åkergatan24',' - 现在显示结果行检查下一张图片
**执行USP_SELECT_CUSTOMERS'maria','Åkergatan24',''** - 由于地址参数的额外空间结束,您可能看不到任何结果
答案 2 :(得分:0)
除了在Raging Bull的答案中执行更改之外,请尝试在每次参数的第二次检查中添加ISNULL
。所以
@fullname = ''
变为
ISNULL(@fullname, '') = ''
并对其他两个参数执行相同的操作。
从内存中Sql Server将只使用您为参数指定的默认值,如果您根本没有传递参数,如果您确实传递了参数但值为null,那么您的查询将仅适用于更改上方。
答案 3 :(得分:0)
我同意@Baljeet所说的......它应该取得理想的结果。
确保您已完成以下操作
1)如果varchar,将参数值内部化为''(空白)
例如@fullName VARCHAR(100) = ''
并且在下面给出的条件下,人们倾向于在OR的第二个条件中犯错误。 确保condtion为Where('Field Name'如'@parametername'OR @parametername ='')
WHERE ((ContactName LIKE @fullName+'%') OR (@fullName = ''))
答案 4 :(得分:0)
我的建议是将参数的默认值定义为NULL的存储过程。数据库擅长处理NULL值,它可以使存储过程定义简单。
然后有条件地从C#传递参数:
if(!String.IsNullOrEmpty(txtFullName.Text))
cmd.Parameters.AddWithValue("@fullName", txtFullName.Text);
//...add other parameters the same way
存储过程应定义如下:
CREATE PROCEDURE USP_SELECT_CUSTOMERS (
@fullName VARCHAR(100) = NULL,
@Address VARCHAR(100) = NULL,
@ContactNumber VARCHAR(15) = NULL
)
AS BEGIN
SELECT * FROM Customers
WHERE ContactName LIKE @fullName+'%'
OR Address LIKE @Address +'%'
OR Phone LIKE @ContactNumber+'%'
--in case you want to select all rows if all the parameters are NULL then add
--this condition too
--OR 1 = CASE WHEN COALESCE(@fullName, @Address, @ContactNumber,'') = '' THEN 1 ELSE 0 END
END