上午我的帖子http://community.csdn.net/Expert/topic/4710/4710955.xml?temp=.5466425
我想用另一种方法做这个,可是没有人回答,我以为不可以实现呢,我结贴后gulf1234(小顾)在没有分的情况下还帮我回答了那个没有解决的问题,十分感激他,我想再开一贴来给他分,在就是想让gulf1234(小顾)和大家看看我理解gulf1234(小顾)的程序对不对,谢谢大家~~
注释是我写的,请大家看看对不对CREATE FUNCTION GetPubName (@ParaOID char(4))--创建用户函数并指定以用户输入的id作为参数
RETURNS Char(120)--返回一个包括所有查出字段(上一个,当前,下一个)以/分隔的字符串
AS
BEGIN
DECLARE
@OID CHAR(4),--定义变量,这个可能是游标滚动的指针
@pub_name1 CHAR(40),--用来存放上一个记录
@pub_name2 CHAR(180),--用来存放当前查到的记录
@pub_name3 CHAR(180)--用来存放下一条记录
Declare Test_Cursor Cursor for--建立游标
select pub_id,pub_name from publishers for read only--找出待处理数据
Open Test_Cursor --打开游标Fetch Test_Cursor into @OID,@pub_name1--取出第一条记录并赋给@OID,@pub_name1
while (@@Fetch_Status=0)--Fetch语句是否执行成功
begin
if @OID=@ParaOID --指针指到的记录就是用户输入的记录
begin
set @pub_name2=rtrim(@pub_name2)+'\'+rtrim(@pub_name1)--字符串连接,用\隔开,找到当前用户输入的纪录了,开始pub_name2是空值,那么就把当前用户的纪录赋给pub_name2,第一次可能是这种情况 空值\用户输入当前记录
Fetch Next from Test_Cursor into @OID,@pub_name1--指针滚动,向下再找一条
set @pub_name3=rtrim(@pub_name2)+'\'+rtrim(@pub_name1)--同上
end
else--如果当前指针没有指到用户输入的
set @pub_name2=rtrim(@pub_name1)--就一边滚动一边覆盖上一个,整个就是用来存第一个值的方法
Fetch Test_Cursor into @OID,@pub_name1--这个是干嘛的?找下一条吗??不明确!!
Close Test_Cursor--关闭游标
Deallocate Test_Cursor--删除游标引用
Return(@pub_name3)--返回值
END我还有个弱智的问题,我怎么运行这个函数啊??我从来没有用过函数,我能在查询分析器里面看效果吗??
谢谢大家了
我想用另一种方法做这个,可是没有人回答,我以为不可以实现呢,我结贴后gulf1234(小顾)在没有分的情况下还帮我回答了那个没有解决的问题,十分感激他,我想再开一贴来给他分,在就是想让gulf1234(小顾)和大家看看我理解gulf1234(小顾)的程序对不对,谢谢大家~~
注释是我写的,请大家看看对不对CREATE FUNCTION GetPubName (@ParaOID char(4))--创建用户函数并指定以用户输入的id作为参数
RETURNS Char(120)--返回一个包括所有查出字段(上一个,当前,下一个)以/分隔的字符串
AS
BEGIN
DECLARE
@OID CHAR(4),--定义变量,这个可能是游标滚动的指针
@pub_name1 CHAR(40),--用来存放上一个记录
@pub_name2 CHAR(180),--用来存放当前查到的记录
@pub_name3 CHAR(180)--用来存放下一条记录
Declare Test_Cursor Cursor for--建立游标
select pub_id,pub_name from publishers for read only--找出待处理数据
Open Test_Cursor --打开游标Fetch Test_Cursor into @OID,@pub_name1--取出第一条记录并赋给@OID,@pub_name1
while (@@Fetch_Status=0)--Fetch语句是否执行成功
begin
if @OID=@ParaOID --指针指到的记录就是用户输入的记录
begin
set @pub_name2=rtrim(@pub_name2)+'\'+rtrim(@pub_name1)--字符串连接,用\隔开,找到当前用户输入的纪录了,开始pub_name2是空值,那么就把当前用户的纪录赋给pub_name2,第一次可能是这种情况 空值\用户输入当前记录
Fetch Next from Test_Cursor into @OID,@pub_name1--指针滚动,向下再找一条
set @pub_name3=rtrim(@pub_name2)+'\'+rtrim(@pub_name1)--同上
end
else--如果当前指针没有指到用户输入的
set @pub_name2=rtrim(@pub_name1)--就一边滚动一边覆盖上一个,整个就是用来存第一个值的方法
Fetch Test_Cursor into @OID,@pub_name1--这个是干嘛的?找下一条吗??不明确!!
Close Test_Cursor--关闭游标
Deallocate Test_Cursor--删除游标引用
Return(@pub_name3)--返回值
END我还有个弱智的问题,我怎么运行这个函数啊??我从来没有用过函数,我能在查询分析器里面看效果吗??
谢谢大家了
--函数没看,不知道对不对
开始我试着select GetPubName('1662')就不可以
加上dbo就可以了
奇怪~~~~~~谢谢~~Yang_(扬帆破浪)
我汗!!
RETURNS Char(120)--返回一个包括所有查出字段(上一个,当前,下一个)以/分隔的字符串
AS
BEGIN
if not exists (select 1 from publishers where pub_id=@ParaOID) --yang没有数据
return ('')
DECLARE
@OID CHAR(4),--定义变量,这个可能是游标滚动的指针
@pub_name1 CHAR(40),--用来存放上一个记录
@pub_name2 CHAR(180),--用来存放当前查到的记录
@pub_name3 CHAR(180)--用来存放下一条记录
Declare Test_Cursor Cursor for--建立游标
select pub_id,pub_name from publishers for read only--找出待处理数据
Open Test_Cursor --打开游标Fetch Test_Cursor into @OID,@pub_name1--取出第一条记录并赋给@OID,@pub_name1
while (@@Fetch_Status=0)--Fetch语句是否执行成功
begin
if @OID=@ParaOID --指针指到的记录就是用户输入的记录
begin
set @pub_name2=rtrim(@pub_name2)+'\'+rtrim(@pub_name1)--字符串连接,用\隔开,找到当前用户输入的纪录了,开始pub_name2是空值,那么就把当前用户的纪录赋给pub_name2,第一次可能是这种情况 空值\用户输入当前记录
Fetch Next from Test_Cursor into @OID,@pub_name1--指针滚动,向下再找一条
set @pub_name3=rtrim(@pub_name2)+'\'+rtrim(@pub_name1)--同上
goto theend ---yang 找到了,跳出
end
else--如果当前指针没有指到用户输入的
begin --yang这里是不是写少了
set @pub_name2=rtrim(@pub_name1)--就一边滚动一边覆盖上一个,整个就是用来存第一个值的方法
Fetch Test_Cursor into @OID,@pub_name1--这个是干嘛的?找下一条吗??不明确!! --yang 没找到就要一直往下找
end --yang这里是不是写少了
end --yang应该这里结束循环 少个end能运行吗
theend: --yang 加标签 可以跳出
Close Test_Cursor--关闭游标
Deallocate Test_Cursor--删除游标引用
Return(@pub_name3)--返回值
END
原来有这么多好心的人,今天太有收获了等gulf1234(小顾)来了我就结贴~~
在增加一个参数,◎Status,设置成“N”,在找到结果后,设置成“Y”。
然后在while (@@Fetch_Status=0)中增加一个判断条件◎Status<>'Y'。但是我测试了一下不行,全部返回NULL值。
(实际上这种方法是可行的,我今天测试过了。昨天失败的原因的我没有在进入循环前对参数◎Status没有设置默认值,系统认为是NULL,当然系统就根据不会进入循环了,自然结果也是NULL)。谢谢Yang_(扬帆破浪),给我提了个醒,可以用GOTO。