首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

使用sp_executesql后执行报错解决思路

2012-04-14 
使用sp_executesql后执行报错--存储过程alter procedure [dbo].[pro_sys_getnewid]@tablename varchar(50)

使用sp_executesql后执行报错
--存储过程
alter procedure [dbo].[pro_sys_getnewid] 
@tablename varchar(50),
@outputtype int,
@getnew int,
@tablekey varchar(30),
@newcode varchar(50) output
/*
declare @newcode varchar(50)
exec pro_sys_getnewid 'sys_userinfo',0,0,'IDK',@newcode output
select @newcode 
*/

as
begin
declare @Snumber varchar(30) --serial number存储取得的最大数字编号
declare @sql nvarchar(1000),@parm nvarchar(1000)
set @getnew=0 --设定getnew为0,按照year+month+date+六位流水码来设定
if @getnew=0
begin 
set @sql=N'select @Snumber1=substring(@tablekey1,1,14) from '+@tablename+'
where substring(@tablekey1,1,4)=year(getdate()) 
and substring(@tablekey1,5,2)=month(getdate()) 
and substring(@tablekey1,7,2)=day(getdate()) '
set @parm='@tablekey1 varchar(30),@Snumber1 varchar(30) output'
exec sp_executesql @sql,@parm,@tablekey1=@tablekey,@Snumber1=@Snumber output;
if @Snumber is null --如果当天没有取得单据号,则新生成单据
begin
set @Snumber=CONVERT(varchar(12) , getdate(), 112 )+'000001';
end
else--取得新的单据号
begin
set @Snumber=convert(numeric(20,0),@Snumber)+1;
end
set @newcode=convert(varchar(50),@Snumber)
select @sql

end
--规则0取号完毕

end

--执行
declare @newcode varchar(50)
exec pro_sys_getnewid 'sys_userinfo',0,0,'IDK',@newcode output
select @newcode 
--结果
消息 245,级别 16,状态 1,第 1 行
在将 varchar 值 'IDK' 转换成数据类型 int 时失败。

[解决办法]
substring('IDK',1,4)=year(getdate()) ?

[解决办法]
sp_executesql 的参数都是Unicode类型的
你把exec sp_executesql @sql,@parm,@tablekey1=@tablekey,@Snumber1=@Snumber output
后面的参数设置成nvarchar类型的 ,看看是不是哪里数据类型转换出错了
[解决办法]
try this,

SQL code
alter procedure [dbo].[pro_sys_getnewid]  @tablename varchar(50),@outputtype int,@getnew int,@tablekey varchar(30),@newcode varchar(50) output/*declare @newcode varchar(50)exec pro_sys_getnewid 'sys_userinfo',0,0,'IDK',@newcode outputselect @newcode  */asbegindeclare @Snumber varchar(30) --serial number存储取得的最大数字编号declare @sql nvarchar(1000),@parm nvarchar(1000)set @getnew=0 --设定getnew为0,按照year+month+date+六位流水码来设定if @getnew=0begin  set @sql=N'select @Snumber1=substring(@tablekey1,1,14) from '+@tablename+'where substring(@tablekey1,1,4)=cast(year(getdate()) as varchar)  and substring(@tablekey1,5,2)=cast(month(getdate()) as varchar)    and substring(@tablekey1,7,2)=cast(day(getdate()) as varchar) 'set @parm=N'@tablekey1 varchar(30),@Snumber1 varchar(30) output'exec sp_executesql @sql,@parm,@tablekey1=@tablekey,@Snumber1=@Snumber output;if @Snumber is null --如果当天没有取得单据号,则新生成单据beginset @Snumber=CONVERT(varchar(12) , getdate(), 112 )+'000001';endelse --取得新的单据号beginset @Snumber=convert(numeric(20,0),@Snumber)+1;endset @newcode=convert(varchar(50),@Snumber)select @sqlend--规则0取号完毕end 

热点排行