• sql参数化 like in 查询问题


    --1. 构造使用IN子句的动态Transact-SQL方法进行编号查询
    --a. 要查询的字段类型是数字型
    --查询的值列表
    DECLARE @idlist varchar(100)
    SET @idlist=’1,2,3’
    --拼接并执行动态Transact-SQL语句
    EXEC(’SELECT * FROM tbname WHERE fdname IN(’+@idlist+’)’)
    GO
    --b. 要查询的字段类型是字符型
    --查询的值列表已经加上了字符串边界符
    DECLARE @idlist varchar(100)
    SET @idlist=’’’a’’,’’b’’’’a’’,’’c’’’
    --拼接并执行动态Transact-SQL语句
    EXEC(’SELECT * FROM tbname WHERE fdname IN(’+@idlist+’)’)
    GO
    --查询的值列表没有字符串边界符
    DECLARE @idlist varchar(100)
    SET @idlist=’a,b’’a,c’
    --由于是字段类型是,所以在拼接时,必须为其加上字符串边界符(’)
    DECLARE @s varchar(1000)
    SET @s=’’’’
    +REPLACE(REPLACE(@idlist,’’’’,’’’’’’),’,’,’’’,’’’)
    +’’’’
    --拼接并执行动态Transact-SQL语句
    EXEC(’SELECT * FROM tbname WHERE fdname IN(’+@s+’)’)
    GO
    /*=====================================================*/
    --2. 使用LIKE或者PATINDEX进行编号查询
    --查询的值列表
    DECLARE @idlist varchar(100)
    SET @idlist=’1,2,3’
    --查询
    SELECT * FROM tbname WHERE CHARINDEX(’,’+RTRIM(fdname)+’,’,’,’+@idlist+’,’)>0
    SELECT * FROM tbname WHERE PATINDEX(’%,’+RTRIM(fdname)+’,%’,’,’+@idlist+’,’)>0
    SELECT * FROM tbname WHERE ’,’+@idlist+’,’ LIKE ’%,’+RTRIM(fdname)+’,%’
    GO
    /*=====================================================*/
    --3. 编号查询中常见的错误
    --a. 最容易犯的错误:表达式充当表达式列表。
    DECLARE @s varchar(100)
    SET @s=’1’
    SELECT id,name FROM sysobjects WHERE id IN(@s)
    /*--结果
    id name
    ---------------- ------------
    1 sysobjects
    --*/
    SET @s=’1,2,3’
    SELECT id,name FROM sysobjects WHERE id IN(@s)
    /*--结果
    服务器: 消息 245,级别 16,状态 1,行 3
    将 varchar 值 ’1,2,3’ 转换为数据类型为 int 的列时发生语法错误。
    --*/
    GO
    --b. 生成动态Transact-SQL语句时忽略了数据类型。
    DECLARE @s varchar(100)
    SET @s=’U,S’
    EXEC(’SELECT id,name FROM sysobjects WHERE id IN(’+@s+’)’)
    /*--结果:
    服务器: 消息 207,级别 16,状态 3,行 1
    列名 ’S’ 无效。
    服务器: 消息 207,级别 16,状态 1,行 1
    列名 ’U’ 无效。
    --*/
    GO
    --c. 忽略了比较的精确性问题。
    --要查询的数据
    DECLARE @t TABLE(col varchar(10))
    INSERT @t SELECT ’1’
    UNION ALL SELECT ’11’
    UNION ALL SELECT ’111’
    UNION ALL SELECT ’22’
    --查询
    DECLARE @s varchar(100)
    SET @s=’111,22’
    SELECT * FROM @t WHERE CHARINDEX(col,@s)>0
    /*--结果
    col
    ----------
    1
    11
    111
    22
    -*/
    GO
    C# , ASP.Net 中 关于 like in 实现参数化查询的问题。2008-09-18 18:17对于 普通的 select等sql语句, 正常的参数化 语句 格式:
    select * from profile where EmployeeID= @EmployeeID
    for example:
    tring loginString = "select * from profile where EmployeeID= @EmployeeID"
    ut please attention to the like sql sentence:
    select * from profile where EmployeeID Like ‘%’ + @EmployeeID + ‘%’;
    The accurate search format is :
    Select * from profile where EmployeeID like +@EmployeeID ;
    So the
    String = "SELECT * from Box WHERE BoxID like ’%’ + @subString + ’%’"
    对本文提供了有价值的文章有:
    c# sql like 参数
    2008-08-08 10:09
    参数化的意义在于把对应的值从参数中提供,对于like语句,like后面的值则包括了单引号中的所有部分,包括百分号(%),因此在参数化like对应的值时,应该把百分号移到参数值中提供,像这样:
    Cmd.Parameters["@KeyWord"].Value = "%" + StrKeyWord + "%";
    可别奢想在sql语句中像这样的样子:
    Select * From [TableName] Where [Column1] like ’%@KeyWord%’
    不会报错,不过你不可能查询到想要的结果.
    我们一般的思维是:
    Like 参数:
    string strSql = "select * from Person.Address where City like ’%@add%’";
    SqlParameter[] Parameters=new SqlParameter[1];
    Parameters[0] = new SqlParameter("@add", "bre");
    In 参数
    string strSql = "select * from Person.Address where AddressID in (@add)";
    SqlParameter[] Parameters = new SqlParameter[1];
    Parameters[0] = new SqlParameter("@add", "343,372,11481,11533,11535,11755,11884,12092,12093,12143");
    可是这样放在程序里面是无法执行的,即使不报错,也是搜索不出来结果的,
    去网上搜索也没有一个明确的答案,经过反复试验,终于解决这个问题
    正确解法如下:
    like 参数
    string strSql = "select * from Person.Address where City like ’%’+ @add + ’%’";
    SqlParameter[] Parameters=new SqlParameter[1];
    Parameters[0] = new SqlParameter("@add", "bre");
    in 参数
    string strSql = "exec(’select * from Person.Address where AddressID in (’+@add+’)’)";
    SqlParameter[] Parameters = new SqlParameter[1];
    Parameters[0] = new SqlParameter("@add", "343,372,11481,11533,11535,11755,11884,12092,12093,12143");

    来源:http://blog.csdn.net/pittroll/article/details/6641054

  • 相关阅读:
    读《人人都是产品经理》
    前端值得看的博客
    git 常用命令 创建查看删除分支,创建查看删除tag等
    看《如何令选择变得更加容易》
    读【失控】——众愚成智
    html5 postMessage
    下拉滚动加载更多数据
    html select用法总结
    分布式系统事务一致性解决方案
    nginx简易教程
  • 原文地址:https://www.cnblogs.com/suizhikuo/p/2395383.html
Copyright © 2020-2023  润新知