[急!急!急!]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+'''
就是给变量加上单引号.但是不会怎么转

求高手帮助!!!
...全文
188 13 打赏 收藏 转发到动态 举报
写回复
用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;

22,210

社区成员

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

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