问题:在将 nvarchar 值转换成数据类型 int 时失败
创建一个存储过程:
备注:ID为Users表的主键int类型
create proc UpdateOnlineStatus(@users nvarchar(500))
as
begin
declare @IDS nvarchar(500)
set @IDS=replace(replace(@users,' ',''),'|',',')
update [Users] set [status]=1 where ID in(@IDS);
update [Users] set [status]=0 where ID not in(@IDS);
end
运行:exec '1|2|3|4'的时候就会报 “在将 nvarchar 值 ‘1,2,3,4’ 转换成数据类型 int 时失败” 这个错误。
其中一个解决办法是运用exec()来执行字符串SQL语句:
代码如下:
create proc [dbo].[UpdateOnlineStatus2](@users nvarchar(500))
as
begin
declare @IDS nvarchar(500)
declare @sql1 nvarchar(1000)
declare @sql2 nvarchar(1000)
set @IDS=replace(replace(@users,' ',''),'|',''',''')
set @sql1='update [Users] set [status]=1 where cast(ID as nvarchar(500)) in('''+@IDS+''')'
set @sql2='update [Users] set [status]=0 where cast(ID as nvarchar(500)) not in('''+@IDS+''')'
exec(@sql1)
exec(@sql2)
end
法二:
create proc [dbo].[UpdateOnlineStatus2](@users nvarchar(500))
as
begin
declare @IDS nvarchar(500)
declare @ID int
set @IDS=@users+'|'
update [Users] set [status]=0;
while(charindex('|',@IDS)>0)
begin
set @ID=SUBSTRING(@IDS,1,charindex('|',@IDS)-1)
select @IDS=SUBSTRING(@IDS,charindex('|',@IDS)+1,LEN(@IDS))
--print @ID;
update [Users] set [status]=1 where ID=@ID;
end
end