在SQL中使用LIKE'%'和整数

问题描述 投票:3回答: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_Names的数据类型是nvarchar,但是Team_Mobileint

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"];
    }

我的问题是:无论如何要替换%将其与整数一起使用?

有什么可以取代%将其与整数一起使用以获得我上面解释的内容?

抱歉我的英语。

c# stored-procedures datagridview textbox sql-server-2008-r2
3个回答
2
投票

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

您的代码中的问题是您要添加intvarchar。尝试重写您的存储过程:

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

@Team_Mobile投射到varchar将使+操作符正确运行,并且应该为您提供您所追求的结果。


一个风格点虽然......

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

将您的电话号码存储为varcharnvarchar,您可以更轻松地完成任务。


4
投票

例如这个

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

2
投票

是的我相信你可以通过:

SELECT * FROM MyTable WHERE Team_Mobile >= @Team_Mobile

如果不修改数据类型,则返回大于700的任何内容(根据您的示例)。

也许

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

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

© www.soinside.com 2019 - 2024. All rights reserved.