首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 关于某面试题的进一步求解 [已结贴,结贴人:iamme81]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • iamme81
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2008-05-16 22:04:04 楼主
    题目在此帖
    http://topic.csdn.net/u/20080225/22/257981b4-0a3d-44df-be94-2494cc6ce091.html
    再帖一编
    题目:  写一存储过程。有一外参类型为Varchar(4000),要求以每行为40个字符为一行

            的格式输出此参数。同一字的字符不能拆分。
           
            1、该参可以不考虑为中文字符。

            2、不考虑单个字的字符数大于40的情况。

    举例:@input='You have to finish all what need to do today' 以10个字符为一行输出,测为:
       
        'You have'
        'to finish'
        'all what'
        'need to do'
        'today'

    大概就是这个意思。请高手过招.....

    目前最佳答案在7楼代码如下:

    DECLARE @s VARCHAR(4000) SELECT @s='aaa bbb ccccccc ddd eee fff ggggggg hh ii kk jjjjjjjj z sddddd efffff' WHILE CHARINDEX(' ',@s)>0  BEGIN  IF SUBSTRING(@s,10,1)!='' AND SUBSTRING(@s,11,1)!=''  BEGIN  PRINT LEFT(@s,10-CHARINDEX(' ',REVERSE(LEFT(@s,10)))) SET @s=STUFF(@s,1,11-CHARINDEX(' ',REVERSE(LEFT(@s,10))),'') END  ELSE  BEGIN  PRINT LEFT(@s,10) SET @s=LTRIM(RIGHT(@s,LEN(@s)-10)) END  END PRINT @s /* aaa bbb ccccccc ddd eee fff ggggggg hh ii kk jjjjjjjj z sddddd */

    可以解决了超过10个长度字符的问题但是若遇到汉字该怎么办,比如遇到
    '我很伟大 挖老大案要案 的的撒播来宾 而后 究其根源 是不是 乃脑袋被灌水了不得 来 来宾sda lai 来'
    上述代码将无限循环
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Limpire
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

      2

    发表于:2008-05-16 22:15:491楼 得分:0
    SQL code
    /* 死循环的代码也能称为最佳? 我原封不动地再用上一贴的代码 */ DECLARE @s VARCHAR(4000) set @s='我很伟大 挖老大案要案 的的撒播来宾 而后 究其根源 是不是 乃脑袋被灌水了不得 来 来宾sda lai 来' declare @c int while len(@s) > 10 begin set @c = charindex(' ', @s) while 1 = 1 begin if charindex(' ', @s, @c + 1) > 11 or charindex(' ', @s, @c + 1) = 0 break set @c = charindex(' ', @s, @c + 1) end print left(@s, @c - 1) set @s = right(@s, len(@s) - @c) end if @s <> '' print @s /* 我很伟大 挖老大案要案 的的撒播来宾 而后 究其根源 是不是 乃脑袋被灌水了不得 来 来宾sda lai 来 */
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Limpire
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

      2

    发表于:2008-05-16 22:22:342楼 得分:20
    不一定是最佳,起码可以正常运作,呵呵。

    稍微改一下就可以解决1句长于N的问题。

    在 print left(@s, @c - 1) 这里判断一下,没行N个,不足N个的再并入下一次Whill1=1循环。

    至于那个代码怎么死循环,让原代码提供者来解决好了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Limpire
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

      2

    发表于:2008-05-16 22:25:133楼 得分:0
    N够大,英文一般不存在问题,如果N过小,就涉及到英文分词的问题。这没有什么难度的,关键是分还是不分的问题。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • happyflystone
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 4

      5

    发表于:2008-05-16 22:29:324楼 得分:0
    强,强大的强
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Herb2
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-16 22:42:155楼 得分:0
    SQL code
    /******************************************/ /*回复:代码20080516004 总:00000000018 */ /*主题:自动换行(不支持汉字和单个单词过长) */ /*作者:二等草 */ /******************************************/ /************例子数据 begin****************/ DECLARE @s VARCHAR(4000) SELECT @s='aaa bbb cc c大家c d的得到dd e fff ggggggg hh ii kk jjjjjjjj z sddddd efffff' /************例子数据 end******************/ /************代码 begin***************/ declare @i int,@j int,@bx int,@l int select @bx = 1,@l = 10,@i = 0,@s = @s+' ' while @bx < len(@s) begin select @j = charindex(' ',@s,@bx) if @j - @i >@l begin print substring(@s,@i,@bx-@i) select @i = @bx end set @bx = @j+1 end print right(@s,@bx-@i) /************代码 end*****************/ /************结果 begin*************** aaa bbb cc c大家c d的得到dd e fff ggggggg hh ii kk jjjjjjjj z sddddd efffff ************结果 end*****************/ /************清除*************************/
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Herb2
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-16 22:56:056楼 得分:0
    SQL code
    /******************************************/ /*回复:代码20080516004 总:00000000018 */ /*主题:自动换行(不支持汉字,支持单个单词过长)*/ /*作者:二等草 */ /******************************************/ /************例子数据 begin****************/ DECLARE @s VARCHAR(4000) SELECT @s='sds abcdefghijklmn cc c大家c d的得到缩短簌阿撒阿撒簌dd e fff ggggggg hh ii kk jjjjjjjj z sddddd efffff' /************例子数据 end******************/ /************代码 begin***************/ declare @i int,@j int,@bx int,@l int select @bx = 1,@l = 10,@i = 1,@s = @s+' ' while @bx < len(@s) begin select @j = charindex(' ',@s,@bx) if @j - @i >@l begin print substring(@s,@i,@bx-@i) select @i = @bx end if @j - @bx > @l set @bx = @bx + @l else set @bx = @j+1 end print right(@s,@bx-@i) /************代码 end*****************/ /************结果 begin*************** sds abcdefghij klmn cc c大家c d的得到缩短簌阿撒阿 撒簌dd e fff ggggggg hh ii kk jjjjjjjj z sddddd efffff ************结果 end*****************/ /************清除*************************/
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • iamme81
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-17 17:52:287楼 得分:0
    引用 1 楼 Limpire 的回复:
    SQL code/*死循环的代码也能称为最佳?
    我原封不动地再用上一贴的代码*/DECLARE@sVARCHAR(4000)set@s='我很伟大 挖老大案要案 的的撒播来宾 而后 究其根源 是不是 乃脑袋被灌水了不得 来 来宾sda lai 来'declare@cintwhilelen(@s)>10beginset@c=charindex('',@s)while1=1beginifcharindex('',@s,@c+1)>11orcharindex('',@s,@c+1)=0breakset@c=charindex('',@s,@c+1)endprintleft(@s,@c-1)set@s=right(@s,len(@s)-@c)endif@s <>''p…

    /*你也半斤八两只要是aa  a  d dasa dsfsdfsgaasfsdaf你就'活'不成了*/

    DECLARE @s VARCHAR(4000)
    set @s='aa  a  d dasa dsfsdfsgaasfsdaf'

    declare @c int
    while len(@s) > 10
    begin
        set @c = charindex(' ', @s)
        while 1 = 1
        begin
            if charindex(' ', @s, @c + 1) > 11 or charindex(' ', @s, @c + 1) = 0 break
            set @c = charindex(' ', @s, @c + 1)
        end
        print left(@s, @c - 1)
        set @s = right(@s, len(@s) - @c)
    end
    if @s <> '' print @s
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • iamme81
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-17 18:06:198楼 得分:0
    引用 1 楼 Limpire 的回复:
    SQL code/*死循环的代码也能称为最佳?
    我原封不动地再用上一贴的代码*/DECLARE@sVARCHAR(4000)set@s='我很伟大 挖老大案要案 的的撒播来宾 而后 究其根源 是不是 乃脑袋被灌水了不得 来 来宾sda lai 来'declare@cintwhilelen(@s)>10beginset@c=charindex('',@s)while1=1beginifcharindex('',@s,@c+1)>11orcharindex('',@s,@c+1)=0breakset@c=charindex('',@s,@c+1)endprintleft(@s,@c-1)set@s=right(@s,len(@s)-@c)endif@s <>''p…

    找出你的问题所在,是因为最后一个英文过长而又取不到空格导致无法@c永久为0,这样就解决了

    DECLARE @s VARCHAR(4000)
    set @s='aa  a  d dasa dsfsdfsgaasfsdaf'

    declare @c int
    while len(@s) > 10
    begin
        set @c = charindex(' ', @s)
        while 1 = 1
        begin
            if charindex(' ', @s, @c + 1) > 11 or charindex(' ', @s, @c + 1) = 0 break
            set @c = charindex(' ', @s, @c + 1)
        end
        if @c=0 --因为最后一个英文过长而又取不到空格导致无法@c永久为0,会导致存储过程死循环,于是强制附值
    开始
        set @c=11
        print left(@s, @c - 1)
        set @s = right(@s, len(@s) - @c)
    end
    if @s <> '' print @s
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Limpire
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

      2

    发表于:2008-05-17 18:11:119楼 得分:0
    引用楼主 iamme81 的帖子:

    2、不考虑单个字的字符数大于40的情况。

    /*你也半斤八两只要是aa  a  d dasa dsfsdfsgaasfsdaf你就'活'不成了*/



    考虑大于N和不考虑大于N,循环条件当然不同!

    DECLARE @s VARCHAR(4000)
    set @s='aa  a  d dasa dsfsdfsgaasfsdaf'

    declare @c int
    while len(@s) > 10 and charindex(' ',@s)>0
    begin
        set @c = charindex(' ', @s)
        while 1 = 1
        begin
            if charindex(' ', @s, @c + 1) > 11 or charindex(' ', @s, @c + 1) = 0 break
            set @c = charindex(' ', @s, @c + 1)
        end
        print left(@s, @c - 1)
        set @s = right(@s, len(@s) - @c)
    end
    if @s  <> '' print @s
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • iamme81
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-17 18:20:2810楼 得分:0
    此外似乎left对汉字和鸟语一视同仁,并没有想汉字要等于两鸟语

    比如
    print left('我们亚洲 风 草 遍及', 9 - 1)
    返回我们亚洲 风 草
    不是我们亚洲
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • iamme81
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-17 18:25:2511楼 得分:0

    declare @n varchar(8)
    set @n='我们亚洲 风 草'
    print left(@n, 9 - 1)
    只显示我们亚洲这样的话要丢字符的^
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • iamme81
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-17 18:26:3812楼 得分:0
    引用 11 楼 iamme81 的回复:

    declare @n varchar(8)
    set @n='我们亚洲 风 草'
    print left(@n, 9 - 1)
    只显示我们亚洲这样的话要丢字符的^


    当然我指的是left等
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Limpire
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

      2

    发表于:2008-05-17 18:33:4113楼 得分:0
    引用 11 楼 iamme81 的回复:

    declare @n varchar(8)
    set @n='我们亚洲 风 草'
    print left(@n, 9 - 1)
    只显示我们亚洲这样的话要丢字符的^


    你要搞清楚,不是left导致丢字符,而是你的变量不够长,截断字符

    declare @n varchar(8)
    set @n='我们亚洲 风 草'
    print @n
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • iamme81
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-17 19:12:2314楼 得分:0
    引用 13 楼 Limpire 的回复:
    引用 11 楼 iamme81 的回复:

    declare @n varchar(8)
    set @n='我们亚洲 风 草'
    print left(@n, 9 - 1)
    只显示我们亚洲这样的话要丢字符的^


    你要搞清楚,不是left导致丢字符,而是你的变量不够长,截断字符

    declare @n varchar(8)
    set @n='我们亚洲 风 草'
    print @n



    当然知道,我指的就是你对@s截去了@c- 1长度的字符,且放到一个只有varchar(10)的变量中,不就导致后半部分的
    汉字丢失了吗?
    现在在思考能不能只截去varchar(10)长度的字符,也就是'我们亚洲 风 草 遍及'只截取'我们亚洲'而不是'我们亚洲 风 草'
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wujumao
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-18 03:21:0315楼 得分:0
    引用 4 楼 happyflystone 的回复:
    强,强大的强
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved