当前位置: 代码迷 >> Sql Server >> 使用sp_executesql后执行报错解决思路
  详细解决方案

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

热度:91   发布时间:2016-04-27 13:23:22.0
使用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 [email protected]+'
where substring(@tablekey1,1,4)=year(getdate()) 
and substring(@tablekey1,5,2)=month(getdate()) 
and substring(@tablekey1,7,2)=day(getdate()) '
set @[email protected] varchar(30),@Snumber1 varchar(30) output'
exec sp_executesql @sql,@parm,@[email protected],@[email protected] 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,@[email protected],@[email protected] 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 [email protected]+'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 @[email protected] varchar(30),@Snumber1 varchar(30) output'exec sp_executesql @sql,@parm,@[email protected],@[email protected] 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