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