CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

存储过程不能返回值,帮忙看一下,谢谢

楼主visualcdotnet(missing connection or connectionstring)2005-05-31 01:45:37 在 MS-SQL Server / 基础类 提问

if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[dbo].[p_GetFullDaMc]')   and   objectproperty(id,   N'IsProcedure')   =   1)  
  drop   procedure   [dbo].[p_GetFullDaMc]  
  GO  
   
  create   procedure   p_GetFullDaMc(@vDaBm   varchar(30),@vTable   varchar(20),   @vBmField   varchar(30),@vMcField   varchar(30),   @vDaMc   varchar(800)   output,   @iOK   int   output)  
  as  
  declare   @iJb   int  
  declare   @iLen   int  
  declare   @vMc   varchar(60)  
  declare   @SqlBm   nvarchar(800)  
  declare   @SqlJb   nvarchar(800)  
  declare   @SqlLen   nvarchar(800)  
  declare   @SqlMc   nvarchar(800)  
  set   @SqlBm=N'select   '+@vBmField+'   from   '+@vTable   +'   where   '+@vBmField+'   =   '''+ltrim(rtrim(@vDaBm))+''''  
  exec(@SqlBm)  
  if   @@rowcount   >   0  
  begin  
          set   @SqlJb=N'select   @iJb=f_jb   from   '+@vTable+   '   where   '+@vBmField+'   =   '''+ltrim(rtrim(@vDaBm))+''''  
          exec   sp_executesql   @SqlJb,N'@iJb   int   output',@iJb   output    
          set   @SqlLen=N'select   @iLen=len('+@vBmField+')   from   '+@vTable   +'   where   f_jb   =@iJb'  
          while   @iJb   >   0  
          begin    
  exec   sp_executesql   @SqlLen,N'@iJb   int,@iLen   int   output',@iJb,@iLen   output  
                  set   @SqlMc=N'select   @vMc='+@vMcField   +'   from   '+@vTable+'   where   '+@vBmField+'   =   '''+substring(ltrim(rtrim(@vDaBm)),1,@iLen)+''''  
                  exec   sp_executesql   @SqlMc,N'@vMc   varchar(60)   output',@vMc   output    
                  print   @vMc--//test  
                  set   @vDaMc=@vDaMc+@vMc   //test  
                  print   @vDaMc//test  
  set   @iJb=@iJb-1  
          end      
          set   @iOK=0  
  end  
  else   set   @iOK=1  
   
  --test  
  declare   @DaMc   varchar(800),@Ok   int  
  exec   p_GetFullDaMc   '0010020010001','tbda_ch','f_chbm','f_chmc',@vDaMc=@DaMc   output   ,   @iOK=@Ok   output  
  select   @DaMc,@Ok  
   
  --result  
   
  (所影响的行数为   1   行)  
   
  DF106废料  
  //why    
  DF106废料  
  //why  
  废锋钢类  
  //why    
  原材料类  
  //why    
   
  (所影响的行数为   1   行)  
   
  -------------------------------------------  
  以前标有test和why处搞不清楚,为什么用这样的方式返回值不行  
  set   @vDaMc=@vDaMc+@vMc 问题点数:100、回复次数:6Top

1 楼zjcxc(邹建)回复于 2005-05-31 08:25:44 得分 100

if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[dbo].[p_GetFullDaMc]')   and   objectproperty(id,   N'IsProcedure')   =   1)  
  drop   procedure   [dbo].[p_GetFullDaMc]  
  GO  
   
  create   procedure   p_GetFullDaMc(@vDaBm   varchar(30),@vTable   varchar(20),   @vBmField   varchar(30),@vMcField   varchar(30),   @vDaMc   varchar(800)   output,   @iOK   int   output)  
  as  
  declare   @iJb   int  
  declare   @iLen   int  
  declare   @vMc   varchar(60)  
  declare   @SqlBm   nvarchar(800)  
  declare   @SqlJb   nvarchar(800)  
  declare   @SqlLen   nvarchar(800)  
  declare   @SqlMc   nvarchar(800)  
   
  set   @vDaMc=''     /***加这句,为变量赋初始值****/  
   
  set   @SqlBm=N'select   '+@vBmField+'   from   '+@vTable   +'   where   '+@vBmField+'   =   '''+ltrim(rtrim(@vDaBm))+''''  
  exec(@SqlBm)  
  if   @@rowcount   >   0  
  begin  
          set   @SqlJb=N'select   @iJb=f_jb   from   '+@vTable+   '   where   '+@vBmField+'   =   '''+ltrim(rtrim(@vDaBm))+''''  
          exec   sp_executesql   @SqlJb,N'@iJb   int   output',@iJb   output    
          set   @SqlLen=N'select   @iLen=len('+@vBmField+')   from   '+@vTable   +'   where   f_jb   =@iJb'  
          while   @iJb   >   0  
          begin    
  exec   sp_executesql   @SqlLen,N'@iJb   int,@iLen   int   output',@iJb,@iLen   output  
                  set   @SqlMc=N'select   @vMc='+@vMcField   +'   from   '+@vTable+'   where   '+@vBmField+'   =   '''+substring(ltrim(rtrim(@vDaBm)),1,@iLen)+''''  
                  exec   sp_executesql   @SqlMc,N'@vMc   varchar(60)   output',@vMc   output    
                  print   @vMc--//test  
                  set   @vDaMc=@vDaMc+@vMc   //test  
                  print   @vDaMc//test  
  set   @iJb=@iJb-1  
          end      
          set   @iOK=0  
  end  
  else   set   @iOK=1Top

2 楼zjcxc(邹建)回复于 2005-05-31 08:26:13 得分 0

--或者调用前初始化变量.  
   
  declare   @DaMc   varchar(800),@Ok   int  
  set   @DaMc=''  
  exec   p_GetFullDaMc   '0010020010001','tbda_ch','f_chbm','f_chmc',@vDaMc=@DaMc   output   ,   @iOK=@Ok   output  
  select   @DaMc,@Ok  
  Top

3 楼zjcxc(邹建)回复于 2005-05-31 08:27:10 得分 0

如果变量没有初始化,那么它的值为NULL,NULL+任何值均为NULL  
   
  所以楼主的问题出在没有初始化变量上.  
  修改存储过程,或者修改调用主要均可以解决问题.Top

4 楼duanduan1122(俺村俺帅!!!)回复于 2005-05-31 08:31:50 得分 0

markTop

5 楼Hopewell_Go(好的在后頭﹗希望更好﹗﹗)回复于 2005-05-31 08:32:32 得分 0

是。  
  鄒大哥說的對我以前就碰到過和樓主你一樣的問題哦Top

6 楼softj(天地客人<最近很迷茫>)回复于 2005-05-31 08:41:24 得分 0

NULL+任何值均为NULL  
  Top

相关问题

  • 高手帮我看一下,取得存储过程的返回值,出现问题?》
  • !!!请大家看一下,这个存储过程为何不返回记录集?
  • 关于存储过程返回值!!!
  • 存储过程返回值的问题.
  • 关于存储过程的返回值.
  • 急!!! C# 中存储过程返回值
  • ****存储过程返回值的问题****
  • 存储过程无法返回值
  • 存储过程如何返回值?
  • 存储过程返回值问题?

关键词

  • ijb
  • vbmfield
  • getfulldamc
  • vdabm
  • sqljb
  • sqlbm
  • vtable
  • nvarchar
  • varchar
  • dbo

得分解答快速导航

  • 帖主:visualcdotnet
  • zjcxc

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo