存储过程拼模糊查询字符串问题 40huanriguang]

发布时间:2016-12-11 20:22:40 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"存储过程拼模糊查询字符串问题 40huanriguang]",主要涉及到存储过程拼模糊查询字符串问题 40huanriguang]方面的内容,对于存储过程拼模糊查询字符串问题 40huanriguang]感兴趣的同学可以参考一下。

declare @indextable table(id int identity(1,1),nid int) set rowcount 1 declare @TureName varchar(50) declare @RoleId varchar(2) set @RoleId='1' set @TureName='三' declare @str1 varchar(500) declare @str2 varchar(500) declare @str3 varchar(500) declare @str4 varchar(500) declare @str5 varchar(5000) set @str1='insert into @indextable(nid) select UserId from Users where 1=1' if @TureName!='' begin set @str2= ' and TureName like  "[email protected]+'%"' end if @RoleId!='0' begin set @str3=' and [email protected] end set @str4= ' order by CreateTime desc select * from ProgramInfo O,@indextable t where O.Id=t.nid and t.id between 1 and 1 order by t.id' set @[email protected][email protected][email protected][email protected] print @str5 这是测试存储过程,结果为: insert into @indextable(nid) select UserId from Users where 1=1 and TureName like  "%三%" and RoleId=1 order by CreateTime desc select * from ProgramInfo O,@indextable t where O.Id=t.nid and t.id between 1 and 1 order by t.id 请问如何将"%三%" 变成单引号。很难搞懂存储过程里拼接sql语句的引号问题,多谢各位大侠帮忙!

门有看见"%三%"..

--1. 构造使用IN子句的动态Transact-SQL方法进行编号查询 --a. 要查询的字段类型是数字型 --查询的值列表 DECLARE @idlist varchar(100) SET @idlist='1,2,3' --拼接并执行动态Transact-SQL语句 EXEC('SELECT * FROM tbname WHERE fdname IN([email protected]+')') GO --b. 要查询的字段类型是字符型 --查询的值列表已经加上了字符串边界符 DECLARE @idlist varchar(100) SET @idlist='''a'',''b''''a'',''c''' --拼接并执行动态Transact-SQL语句 EXEC('SELECT * FROM tbname WHERE fdname IN([email protected]+')') 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([email protected]+')') GO /*=====================================================*/ --2. 使用LIKE或者PATINDEX进行编号查询 --查询的值列表 DECLARE @idlist varchar(100) SET @idlist='1,2,3' --查询 SELECT * FROM tbname WHERE CHARINDEX(','+RTRIM(fdname)+',',',[email protected]+',')>0 SELECT * FROM tbname WHERE PATINDEX('%,'+RTRIM(fdname)+',%',',[email protected]+',')>0 SELECT * FROM tbname WHERE ',[email protected]+',' 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([email protected]+')') /*--结果: 服务器: 消息 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

TureName like [email protected]+'%'''

declare @indextable table(id int identity(1,1),nid int) set rowcount 1  declare @TureName varchar(50) declare @RoleId varchar(2) set @RoleId='1'  set @TureName='三' declare @str1 varchar(500) declare @str2 varchar(500)  declare @str3 varchar(500) declare @str4 varchar(500) declare @str5 varchar(5000)  set @str1='insert into @indextable(nid) select UserId from Users where 1=1'   if @TureName!='' begin set @str2= ' and TureName like [email protected]+'%'''   end if @RoleId!='0' begin set @str3=' and [email protected] end    set @str4= ' order by CreateTime desc select * from ProgramInfo O,@indextable t where O.Id=t.nid and t.id between 1 and 1 order by t.id'    set @[email protected][email protected][email protected][email protected] print @str5 

动态拼接的话需要转义字符.... '''表示一个'

 like [email protected]+'%'

and TureName like "[email protected]+'%"' --》and TureName like [email protected]+'%''' 

引用 4 楼 andysun88 的回复:SQL [email protected](idintidentity(1,1),nidint)[email protected](50)[email protected](2)[email protected][email protected][email protected](500)[email protected](500)d?- 这样的话可以了,但是又有一个新问题,[email protected],这样拼接上去,系统会不会不认识这个临时表?谢谢大侠啦!

declare @indextable table(id int identity(1,1),nid int) 删除加入到字符串里 --- set @str1='declare @indextable table(id int identity(1,1),nid int) insert into @indextable(nid) declare  @i table (id int) exec('insert @i select 1 select * from @i') /* 消息 1087,级别 15,状态 2,第 1 行 必须声明表变量 "@i"。 */ exec('declare  @i table (id int) insert @i select 1 select * from @i') /* (1 行受影响)          id -----------           1 (1 行受影响) */

引用 9 楼 ldslove 的回复:declare @indextable table(id int identity(1,1),nid int) 删除加入到字符串里 --- set @str1='declare @indextable table(id int identity(1,1),nid int) insert into @indextable(nid) SQL [email protected] (idint)exec('insert @i select 1 select * from @i')/* 消息 1087,级别 15,状态 2,第 1 行 必须声明表变量 "@i"。*/exec('declare  @i table (id int) insert @i select 1 select * from @i')/* (1 行受影响)          id -----------           1 (1 行受影响)*/ 好的,谢谢!有需要再请高手帮忙!

引用 3 楼 andysun88 的回复:SQL code [email protected]+'%''' 谢谢啦!

引用 9 楼 ldslove 的回复:declare @indextable table(id int identity(1,1),nid int) 删除加入到字符串里 --- set @str1='declare @indextable table(id int identity(1,1),nid int) insert into @indextable(nid) SQL [email protected] (idint)exec('insert @i select 1 select * from @i')/* 消息 1087,级别 15,状态 2,第 1 行 必须声明表变量 "@i"。*/exec('declare  @i table (id int) insert @i select 1 select * from @i')/* (1 行受影响)          id -----------           1 (1 行受影响)*/ 有点乱,没看太明白,呵呵

上一篇:游标问题 40分,无满意结帖,结帖人stmn1320]
下一篇:[推荐] 【T-MAC学习笔记散记总结2】 300feixianxxx]

相关文章

相关评论