[急!急!急!]SQL按行遍历

a826500051 2008-10-16 07:01:33
有用户表[UserInfo]如何循环里取出来UserID这个字段

我是这么写的
create proc proc_messages

as
declare @temp varchar(200)
declare @str varchar(200)
declare @i int
select @i=count(*) from userInfo
set @str=''
while(@i>0)
begin
select top 1 @temp=userid fom userinfo where userid not in(@str)
set @str=@temp+','+@str
set @i=@i-1
end


但是这样查不出来!
我觉得应该在写成
Set @str='''+@str+'',''+@temp+'''
就是给变量加上单引号.但是不会怎么转

求高手帮助!!!
...全文
192 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
fcuandy 2008-10-16
  • 打赏
  • 举报
回复
如果:
declare @tmp varchar(1000)
set @tmp = ''
select @tmp = @tmp + ',' + rtrim(userid) from tb
这样,最前面会多出一个逗号即 ,1,3,4,5
因为第一次执行时@tmp是'',则用 '' + ',' + rtrim(userid)

不给@tmp初始化,则第一次时@tmp为null
isnull(@tmp + ',','') 在第一次时 null +','仍为null,则结果为 '' + rtrim(userid)
第二次时,因为@tmp为第一行的userid值了,则 @tmp + ',' 为 每一行的userid+',' 不为null,然后 +',' 这样避免了最前面多出一个逗号。

不这样处理的话,在递规查询完毕后,用stuff(@tmp,1,1,'')或substring,或right去掉第一个,就可以了。


这种依赖于记录的顺序。 不能order by,不能将递规变量再用作过滤,因为在编译时条件中的变量值就被确定下回来了。所以很多情况下,这种写法并不能得到预期的效果。

sql2005中推荐的方式是使用xml串连。
wxg22526451 2008-10-16
  • 打赏
  • 举报
回复
@temp=isnull(@temp+',', '')+ 是什么意思?
//@temp+','为null的话就赋值为''值

还有 如果想给字符串里加 ' (单引号要怎么做呢)
//两个单引号转义为'
select '字符串'''
等不到来世 2008-10-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 a826500051 的回复:]
功能已经实现了
不过我还想问下
@temp=isnull(@temp+',', '')+

是什么意思?
[/Quote]

isnull(@temp+',', ''):

如果第一个参数为空(这里即@temp为null),那么取第二个参数作为表达式的值(这里为'')
-晴天 2008-10-16
  • 打赏
  • 举报
回复
字符串中两个连续的单引号代表串中的一个单引号.
a826500051 2008-10-16
  • 打赏
  • 举报
回复
还有 如果想给字符串里加 ' (单引号要怎么做呢)
a826500051 2008-10-16
  • 打赏
  • 举报
回复
功能已经实现了
不过我还想问下
@temp=isnull(@temp+',', '')+

是什么意思?
水族杰纶 2008-10-16
  • 打赏
  • 举报
回复
create proc proc_messages 
@str varchar(8000) output
as
declare @temp varchar(200)
select @temp=isnull(@temp+',', '')+userid from userinfo
set @str=@temp
go
declare @s varchar(8000)
exec proc_messages @s output
select @s
mjjzg 2008-10-16
  • 打赏
  • 举报
回复
学习一下
a826500051 2008-10-16
  • 打赏
  • 举报
回复


create proc proc_messages

as
declare @temp varchar(200)
declare @str varchar(200)
declare @i int
select @i=count(*) from userInfo
set @str=''
while(@i>0)
begin
select top 1 @temp=userid fom userinfo where userid not in(@str)
--每查到一个userid ,就插入到 另一个表中
--insert into mess values(....)
set @str=@temp+','+@str

set @i=@i-1
end

我是想在循环中,每次都取一个USERID

2.3楼的 是把全部的查出来了
dobear_0922 2008-10-16
  • 打赏
  • 举报
回复
--try
create proc proc_messages
as
declare @temp varchar(200)
select @temp=isnull(@temp+',', '')+userid from userinfo
end
dobear_0922 2008-10-16
  • 打赏
  • 举报
回复
--try
create proc proc_messages
as
declare @temp varchar(200)
select @temp=isnull(@temp+',', '')+userid from userinfo
end
liangCK 2008-10-16
  • 打赏
  • 举报
回复
--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
liangCK 2008-10-16
  • 打赏
  • 举报
回复
DECLARE @str varchar(20);

SET @str='';

SELECT @str=@str+','+userid
FROM userinfo;

SELECT @str;
独辟蹊径,角度很好,尤其适合我们要找一个好工作的想法,你为公司做了很多事情,也学了很多技术,可是 面试的题目你不一定能够过关,因为面试考题角度特别。要提高自己的生存能力,还是多研究一下吧。我看了前面的四章,还是有收获的,包括技术上。 程序员面试攻略》 偶得此书,观之,叹为奇书。从求职到面试,从数据结构到算法,从智力题到非技术题,无不一一涵盖。上网搜之,得矣。列诸信息及下载地址,供大家参考。同时也祝贺找工作完全进入应试时代…… 《程序员面试攻略》(Programming Interview Exposed: Secrets to Landing Your Next Job),Mongan,J.等著,杨晓云等译,北京,机械工业出版社,2003.3 目录: 第1章求职过程1 1.1 与公司进行接触1 1.2 筛选面试3 1.3 正式面试3 1.4 衣着4 1.5 职业中介4 1.6 工作邀约和磋商5 1.7 接受或拒绝工作邀约7 第2章程序设计面试题的解答思路9 2.1 面试过程9 2.2 关于面试题11 2.3 答题方法11 2.4 遇到疑难时13 2.5 对解决方案进行分析15 第3章链表19 3.1 单向链表19 3.1.1 头指针的修改20 3.1.2 遍历21 3.1.3 插入与删除22 3.2 双向链表24 3.3 循环链表24 3.4 面试例题:堆栈的实现25 3.5 面试例题:链表的尾指针31 3.6 面试例题:对RemoveHead函数进行纠错37 3.7 面试例题:链表中的倒数第m个元素39 3.8 面试例题:链表的扁平化42 3.9 面试例题:空链表与循环链表48 第4章树和图53 4.1 树53 4.1.1 二元树54 4.1.2 二元搜索树55 4.1.3 堆57 4.1.4 常用的搜索方法58 4.1.5 遍历58 4.2 图59 4.3 面试例题:左遍历59 4.4 面试例题:左遍历,不使用递归60 4.5 面试例题:最低公共祖先63 第5章数组与字符串65 5.1 数组65 5.1.1 C / C++ 66 5.1.2 Java 67 5.1.3 Perl67 5.2 字符串68 5.2.1 C 68 5.2.2 C++ 68 5.2.3 Java 69 5.2.4 Perl 69 5.3 面试例题:第一个无重复字符69 5.4 面试例题:删除特定字符72 5.5 面试例题:颠倒单词的出现顺序76 5.6 面试例题:整数/字符串之间的转换81 第6章递归算法87 6.1 面试例题:二分法搜索91 6.2 面试例题:字符串的全排列93 6.3 面试例题:字符串的全组合98 6.4 面试例题:电话键单词101 第7章其他程序设计问题109 7.1 计算机图形109 7.2 位操作符110 7.3 结构化查询语言112 7.4 并发程序设计技术115 7.5 面试例题:绘制八分之一圆形117 7.6 面试例题:矩形是否重叠120 7.7 面试例题:字节的升序存储和降序存储方式124 7.8 面试例题:“1”的个数126 7.9 面试例题:简单的SQL查询129 7.10 面试例题:公司和员工数据库129 7.11 面试例题:最大值,不允许使用统计功能131 7.12 面试例题:生产者/消费者问题132 第8章与计数、测量、排序有关的智力题139 8.1 面试例题:开锁143 8.2 面试例题:三个开关145 8.3 面试例题:过桥146 8.4 面试例题:找石头149 第9章与图形和空间有关的智力题153 9.1 面试例题:船和码头154 9.2 面试例题:数方块156 9.3 面试例题:狐狸与鸭子159 9.4 面试例题:导火索161 9.5 面试例题:躲火车163 第10章计算机基础知识165 10.1 个人简历165 10.2 答题要点165 10.3 面试例题:C++和Java 166 10.4 面试例题:头文件167 10.5 面试例题:存储类别167 10.6 面试例题:friend类168 10.7 面试例题:类与结构168 10.8 面试例题:父类与子类169 10.9 面试例题:参数传递170 10.10 面试例题:宏与内嵌函数171 10.11 面试例题:继承173 10.12 面试例题:面向对象的程序设计173 10.13 面试例题:与线程有关的程序设计问题174 10.14 面试例题:废弃内存的自动回收175 10.15 面试例题:32位操作系统177 10.16 面试例题:网络性能177 10.17 面试例题:高速磁盘缓存177 10.18 面试例题:数据库的优点178 10.19 面试例题:加密技术178 10.20 面试例题:新的加密算法179 10.21 面试例题:哈希表与二元搜索树1 7 9 第11章非技术问题181 11.1 答题要点181 11.2 问题:你打算从事哪方面的工作? 182 11.3 问题:你最喜欢的程序设计语言是哪一种? 183 11.4 问题:你的工作习惯是怎样的?184 11.5 问题:可以说说你的个人经历吗?184 11.6 问题:你的职业目标是什么? 184 11.7 问题:你为什么要换工作? 184 11.8 问题:你希望拿多少报酬? 185 11.9 问题:你以前的报酬水平是多少? 187 11.10 问题:我们为什么要雇佣你? 188 11.11 问题:你有什么问题想问我吗?188 附录写个人简历的方法189 VII

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧