教程学院
图像设计 多媒体类 机械制图 办公软件 操作系统 系统编程 网站编程 网页制作 数据库类 网络路由 网络工程 网络安全 考试认证
firefox火狐浏览器下载
酷网学院
CAD
AutoCad Cam350 ProEngineer GCcam MATLAB Unigraphics SolidWorks CAXA Solid3000 Cimatron EdgeCAM
系统
安全 防火墙 病毒 WinXP Win2003 Vista
数据库
编程
网络
精彩图库
  当前位置: 库库中文网 · 数据库类教程 · MSSQL教程 · Sql2000基础教程

简略疑难,送分,查询

学院最新推荐文章
教程推荐
『简略疑难,送分,查询』如果文章有大量图片,显示会较慢,请等待图片下载完成
 
点击数: 更新时间:2008-10-7 
传进来的数据是 1005,1009,1010,1015,1016,1017,1018,1019,
我要做一个存储过程,就是把","替换掉,换成
select * from operator where OperatorID=1005 or OperatorID=1009 or OperatorID=1010 or OperatorID=1015.....
也就是个多个参数的查询,请问怎么做.或者用其它方法也可以.谢谢了.

这个问题第1个回答:
SQL code

--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


这个问题第2个回答:
引用楼主 lfoy112 的帖子:
传进来的数据是 1005,1009,1010,1015,1016,1017,1018,1019,
我要做一个存储过程,就是把","替换掉,换成
select * from operator where OperatorID=1005 or OperatorID=1009 or OperatorID=1010 or OperatorID=1015.....
也就是个多个参数的查询,请问怎么做.或者用其它方法也可以.谢谢了.


也可以先将这个数据..放到一个临时表中..形式如:
1005
1009
1015
..
然后再与你的opeartor表Join一下就行了..
这个问题第3个回答:
SQL code

declare @s varchar(200)

set @s = '1005,1009,1010,1015,1016,1017,1018,1019,'

set @s = 'select * from operator where OperatorID='+replace(left(@s,len(@s) - 1),',',' Or OperatorID= ' )



select @s

/*

select * from operator where  OperatorID=1005 Or OperatorID= 1009 Or OperatorID= 1010 Or OperatorID= 1015 Or OperatorID= 1016 Or OperatorID= 1017 Or OperatorID= 1018 Or OperatorID= 1019



(所影响的行数为 1 行)

*/


这个问题第4个回答:
SQL code

create procedure proc_getList(@list varchar(1000))

as begin

  -- 下行剔除重复的逗号

  set @list = replace(replace(@list,' ',''),',,',',')

  -- 下面的循环剔除末尾的逗号

  while right(@list,1)=',' begin

    set @list = rtrim(left(@list,len(@list)-1))

  end

  -- 生成动态脚本

  declare @sql varchar(2000)

  set @sql = 'select * from operator where OperatorID in ('+@list+')'

  -- 并执行

  exec(@sql)

end


这个问题第5个回答:
SQL code



declare @OperatorID nvarchar(2000)

set @OperatorID='1005,1009,1010,1015,1016,1017,1018,1019,'

select * from operator where charindex(','+rtrim(OperatorID)+',',','+@OperatorID)>0




这个问题第6个回答:
该回复于2008-10-07 11:16:48被版主删除
这个问题第7个回答:
SQL code

DECLARE @STR VARCHAR(50);

SET @STR='1005,1009,1010,1015,1016,1017,1018,1019'



DECLARE @SQL VARCHAR(1000);



SET @SQL='';



SELECT @SQL='SELECT data='+REPLACE(@STR,',',' UNION ALL SELECT data=')



CREATE TABLE #(data VARCHAR(10))



EXEC ('INSERT # SELECT * FROM ('+@SQL+') AS t')



select * from operator as o

 join # 

on o.OperatorID=#.data 


作者:lfoy112 来源:C.S.D.N
】【关闭窗口
·上页:
·下页:
相关文章
     数据库类教程 - Sql2000基础教程
普通教程求助: 将中文字插入Sql Server2
普通教程怎么样删除SQL Server数据库里面
普通教程数据库表关系
普通教程SQL Server数据文件疑难!新手!
普通教程我这个存储过程为啥总有疑难 急
普通教程c#(asp.net)写地一个即时在线聊
普通教程错误9003:LSN(39:431:1)无效,该
普通教程SQL2000 查询说明器中地 对象搜
普通教程关于表变量地疑难
普通教程C# 参数化更新书库地疑难
普通教程sql语法迁移到ac中运用地疑难
普通教程求一个根据IP和掩码位数计算起止
精彩图片汇集
advertisement
关于站点 - 广告服务 - 联系我们 - 版权隐私 - 免责声明 - 合作伙伴 - 程序支持 - 网站地图 - 返回顶部
网站文本地图
版权所有:库库中文 2005-2007 欢迎各种媒体转载我们的原创作品[转载请注明出处]
copyright © 2005-2008 www.QQGB.com online services. all rights reserved. 蜀ICP备05015578
Template designed by Virus. Optimized for 1024x768 to Firefox,Opera and MS-IE6. Site powered by EQL.
红盾
热爱电脑,热爱生活
拥有电脑,拥有生命
让我们享受拥有电脑的时光