日期:2014-05-18  浏览次数:20519 次

使用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 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)=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 --如果当天没有取得单据号,则新生成单据
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