使用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,
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