第一次在这提问,别让我伤心,呵呵。。。。

pxiaoli 2006-09-17 08:22:30
我正在开始学习邹建大虾出的那个sql server的书,书很好,只是对我来说有点难,问题如下:
CREATE FUNCTION f_splitSTR(
@s varchar(8000), --待分拆的字符串
@split varchar(10) --数据分隔符
)RETURNS @re TABLE(col varchar(100))
AS
BEGIN
DECLARE @splitlen int
SET @splitlen=LEN(@split+'a')-2
WHILE CHARINDEX(@split,@s)>0
BEGIN
INSERT @re VALUES(LEFT(@s,CHARINDEX(@split,@s)-1))
SET @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,'')
END
INSERT @re VALUES(@s)
RETURN
END

declare @a as varchar,@b as varchar
set @a='1,2,3,4,5'
set @b=','
select * from f_splitSTR(@a,@b)

结果只有1

我要怎么调这个函数才能取出所有数据

还有,请问一下,我用asp能不能使用这个在sql server中定义的函数?

谢谢各位了先!
...全文
787 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
linzj19s 2006-09-18
  • 打赏
  • 举报
回复
厉害人物啊
pizisanmu 2006-09-18
  • 打赏
  • 举报
回复
你们可真厉害啊,还有皱建大虾都来了啊,好好学习了.
pxiaoli 2006-09-17
  • 打赏
  • 举报
回复
好了,继续学习
pxiaoli 2006-09-17
  • 打赏
  • 举报
回复
解决了,贴子回复次数大于跟给分次数----这啥意思?
hellowork 2006-09-17
  • 打赏
  • 举报
回复
没关系,别客气.问题解决了吗?
pxiaoli 2006-09-17
  • 打赏
  • 举报
回复
55555,偶像啊,太强了,太感谢了,打扰你一晚上,谢谢了
hellowork 2006-09-17
  • 打赏
  • 举报
回复
asp当然会支持了,这仅仅是个SQL字符串构建而已.这样试试:
sql=" declare @str varchar(1000); select @str = check_box from test where id=1; select * from DBO.f_splitSTR(@str,',') " /*为每行加";"*/
pxiaoli 2006-09-17
  • 打赏
  • 举报
回复
我在查询分析器里试了你给我的程序,可以正确的得到我想要的结果,可是在asp里试就不可以,应该是asp不支持这样吧
hellowork 2006-09-17
  • 打赏
  • 举报
回复
对,试试吧
set @str = '1,2,3,4,5'
----------------------------------------------
select @str = check_box from test where id=1
pxiaoli 2006-09-17
  • 打赏
  • 举报
回复
sql="declare @str varchar(1000) set @str = '1,2,3,4,5' select * from DBO.f_splitSTR(@str,',')"

set rs=conn.execute (sql)

你的意思是让我这样吗?先取出那个1,2,3,4,5---因为函数不支持子查询,是不?
hellowork 2006-09-17
  • 打赏
  • 举报
回复
if object_id('tbTry') is not null
drop table tbTry
GO
----创建测试表
create table tbTry(id int,s varchar(100))
insert tbTry
select 1,'1,2,3,4,5' union all
select 2,'3,4,5'
GO
declare @sql varchar(2000)
set @sql='
declare @str varchar(1000)
select @str = s from tbTry where id=1 /*把值保存到变量中*/
select * from DBO.f_splitSTR(@str,'','')
'
exec(@sql)

drop table tbTry

/*结果
1
2
3
4
5
*/
hellowork 2006-09-17
  • 打赏
  • 举报
回复
提示的错误是什么?
pxiaoli 2006-09-17
  • 打赏
  • 举报
回复
好像不能这样调的,我试了一下不可以呢
hellowork 2006-09-17
  • 打赏
  • 举报
回复
函数的参数不能是子查询.变通的办法是将子查询的结果保存到变量中,再将该变量作为函数的参数.即:

sql="select * from DBO.f_splitSTR(select check_box from test where id=1,',')"
改为
sql="
declare @str varchar(1000)
select @str = check_box from test where id=1 /*把值保存到变量中*/
select * from DBO.f_splitSTR(@str,',')
"
pxiaoli 2006-09-17
  • 打赏
  • 举报
回复
sql="select * from DBO.f_splitSTR('1,2,3,4,5',',')"
set rs=conn.execute (sql)
if not rs.eof then
while not rs.eof
response.Write rs(0)&"<br>"
rs.movenext
wend
end if
rs.close
set rs=nothing

这样在asp中就能显示出12345

test表中id=1记录中check_box字段中内容为1,2,3,4,5
sql="select * from DBO.f_splitSTR(select check_box from test where id=1,',')"
set rs=conn.execute (sql)
if not rs.eof then
while not rs.eof
response.Write rs(0)&"<br>"
rs.movenext
wend
end if
rs.close
set rs=nothing

这样为什么就不行呢?

还有就是是在数据库中调用函数把字段内容分开效率好,还是我用vbs写个函数进行同样的操作好?
Well 2006-09-17
  • 打赏
  • 举报
回复
它返回的是一个表(Table)
所以就
select * from dbo.f_splitSTR(@a,@b)
pxiaoli 2006-09-17
  • 打赏
  • 举报
回复
我试试
zjcxc 元老 2006-09-17
  • 打赏
  • 举报
回复
declare @a as varchar(100),@b as varchar -- @a定义没有指定长度, 这样只能保存1个字符
set @a='1,2,3,4,5'
set @b=','
select * from f_splitSTR(@a,@b)
pxiaoli 2006-09-17
  • 打赏
  • 举报
回复
先谢谢hellowork(一两清风) ,一会就结贴
hellowork 2006-09-17
  • 打赏
  • 举报
回复
还有,请问一下,我用asp能不能使用这个在sql server中定义的函数?
-------------------------------------------------------------------------------
当然可以了.返回类型为table类型的函数在调用时可以不在自定义函数前加所有者(如本例),否则必须在调用时加函数所有者,例如:
select * from DBO.f_splitSTR(@a,@b) /*大写的为函数所有者*/
加载更多回复(3)

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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