3

我在 SQL Server 中有这个过程:

create procedure AutoSearchTeamByMobile
@Team_Mobile int
As
select * from Team_Info where Team_Mobile like @Team_Mobile+'%';

我在 C# 中有这段代码:

private void textBoxX4_TextChanged(object sender, EventArgs e)
    {
        int tMobile= int.Parse(textBoxX4.Text);
        SqlCommand com = new SqlCommand("AutoSearchTeamByMobile", con);
        com.Parameters.Add("@Team_Mobile", SqlDbType.Int).Value = tMobile;
        com.CommandType = CommandType.StoredProcedure;
        SqlDataAdapter da = new SqlDataAdapter();
        DataSet ds = new DataSet();
        da.SelectCommand = com;
        da.Fill(ds, "Team_Info");
        dataGridViewX1.DataSource = ds.Tables["Team_Info"];
    }

我有一个手机号码列表,它们保存在名为的列中Team_Mobile,数据类型为int,其中一个以'711......'开头,另一个以'700......'开头,所以现在当我textBoxX4只写 '7' 那么所有数字(以 711 或 700 开头)都应该出现在 中dataGridViewX1,但是当我写 '71' 时,只有以 '711' 开头的数字才能出现在dataGridViewX1. 当我写“70”时,只有以 700 开头的数字才会出现在dataGridViewX1. 我没有得到我需要的东西,实际上我没有看到任何与我没有做任何事情相同的事情。

我的需要,当我写 71 时,Team_Mobile 列中包含 711 的所有记录仍应出现,而其他数字应隐藏。

但是我用它做了它Team_Names并且它有效,因为数据类型Team_Namesis nvarchar,但是Team_Mobileis int

sql:

create procedure AutoSearchTeam
@Team_Name nvarchar (50)
As
select * from Team_Info where Team_Name like @Team_Name+'%';

C#:

    private void textBoxX1_TextChanged(object sender, EventArgs e)
    {
        string t_name = textBoxX1.Text;
        SqlCommand com = new SqlCommand("AutoSearchTeam", con);
        com.Parameters.Add("@Team_Name", SqlDbType.NVarChar, 50).Value = t_name;
        com.CommandType = CommandType.StoredProcedure;
        SqlDataAdapter da = new SqlDataAdapter();
        DataSet ds = new DataSet();
        da.SelectCommand = com;
        da.Fill(ds, "Team_Info");
        dataGridViewX1.DataSource = ds.Tables["Team_Info"];
    }

我的问题是:有没有%用整数代替它?

我可以%用整数代替什么来获得我上面解释的内容?

对不起我的英语。

4

3 回答 3

5

例如这个

SELECT * FROM Team_Info WHERE Team_Mobile LIKE CAST(@Team_Mobile AS NVARCHAR) + '%';
于 2013-10-31T21:23:43.483 回答
3

LIKE运算符是一个字符串函数。它需要一个字符串输入来进行测试,并会在进行比较之前尝试将输入值自动转换为字符串(varchar或)。nvarchar由于这种隐式转换,您可以将 if 用于数字。

您的代码中的问题是您正在添加一个int和一个varchar. 尝试将您的存储过程重写为:

CREATE PROCEDURE AutoSearchTeamByMobile
    @Team_Mobile int
AS
SELECT * FROM Team_Info WHERE Team_Mobile LIKE CAST(@Team_Mobile AS NVARCHAR) + '%';

转换@Team_Mobilevarchar将使+运算符正常运行,并应为您提供所需的结果。


一个风格点虽然...

由于各种原因,将电话号码存储为整数可能会出现问题。在某些时候,您会遇到无法存储在有限整数范围内的电话号码。我的一个数据库中有数以千计的电话号码,长度为 16 个字符,即使我去掉了国际拨号说明符,它们也不适合整数。

将您的电话号码存储为varcharor nvarchar,您通常会更轻松地处理事情。

于 2013-10-31T22:30:17.247 回答
2

是的,我相信您可以通过以下方式:

SELECT * FROM MyTable WHERE Team_Mobile >= @Team_Mobile

以上返回大于 700 的任何内容(根据您的示例)而不修改数据类型。

也许

SELECT * FROM MyTable WHERE CAST(Team_Mobile AS NVARCHAR(MAX)) LIKE @Team_Mobile + '%'

将列转换为字符串,从而允许您使用通配符。

于 2013-10-31T21:28:07.497 回答