存储过程不能返回值,帮忙看一下,谢谢
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




