首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

存储过程类型转换失败解决办法

2013-08-09 
存储过程类型转换失败存储过程如下:create proc proc_SetAdminPermissions@adminId int,@actions varchar(

存储过程类型转换失败
存储过程如下:


create proc proc_SetAdminPermissions
@adminId int,
@actions varchar(4000)
as
begin
declare @userIfExists int,@sql varchar(500)
select @userIfExists=COUNT(*) from adminaction where adminid=@adminId
print @userIfExists 
if(@userIfExists > 0)
begin
set @sql = 'update adminaction set actionids='+@actions +' where adminid=' +@adminId
end
else
begin
set @sql = 'insert into adminaction(adminid,actionids) values('+@adminId+','+@actions+')'
end
exec(@sql)
end


错误信息如下:
0
消息 245,级别 16,状态 1,过程 proc_SetAdminPermissions,第 15 行
在将 varchar 值 'insert into adminaction(adminid,actionids) values(' 转换成数据类型 int 时失败。 存储过程
[解决办法]
try this,

create proc proc_SetAdminPermissions
@adminId int,
@actions varchar(4000)    
as
begin
    declare @userIfExists int,@sql varchar(500)
    select @userIfExists=COUNT(*) from adminaction where adminid=@adminId
    print @userIfExists 
    
    if(@userIfExists > 0)
    begin
       set @sql = 'update adminaction set actionids='''+@actions +''' where adminid='+rtrim(@adminId)
    end
    else       
    begin
       set @sql = 'insert into adminaction(adminid,actionids) values('''+@adminId+''','+rtrim(@actions)+')'
    end
    
    exec(@sql)
end

[解决办法]
--actionids, adminid 字段如果不是整型,需要加引号
--拼字段串时,需要把INT转换为字符型,再相加


declare
    @adminId int,
    @actions varchar(4000) 
SELECT @adminId = 1, @actions = 'test'
DECLARE @sql NVARCHAR(MAX)

set @sql = 'update adminaction set actionids='''+@actions +''' where adminid=' +CAST(@adminId AS VARCHAR(10))
PRINT @sql
set @sql = 'insert into adminaction(adminid,actionids) values('+CAST(@adminId AS VARCHAR(10))+','''+@actions+''')'
PRINT @sql


[解决办法]
create proc proc_SetAdminPermissions
@adminId int,
@actions varchar(4000)    
as
begin
    declare @userIfExists int,@sql varchar(500)
    select @userIfExists=COUNT(*) from adminaction where adminid=@adminId
    print @userIfExists 
    
    if(@userIfExists > 0)
    begin
       set @sql = 'update adminaction set actionids='''+@actions +''' where adminid='+rtrim(@adminId)
    end
    else       
    begin
       set @sql = 'insert into adminaction(adminid,actionids) values('''+CAST(@adminId AS VARCHAR)+''','+rtrim(@actions)+')'
    end
    
    exec(@sql)
end

[解决办法]
--先看一下正常的语句
SELECT * FROM tablename WHERE fieldname LIKE '%test' ORDER BY FId
 
--如果想把上面的语句放到字符串中再用exec执行,步骤如下
--#1.把SQL中的'全部替换成''
SELECT * FROM tablename WHERE fieldname LIKE ''%test'' ORDER BY FId
--#2.放到变量中
DECLARE @sql NVARCHAR(max)
SET @sql = 'SELECT * FROM tablename WHERE fieldname LIKE ''%test'' ORDER BY FId'
--#3.替换参数(注意替换的参数必须都是字符类型),替换时直接: '+ @变量名 +',如果变量不是字符型,则转换成字符型(RTRIM(@变量名)或CAST或CONVERT)
DECLARE @变量名 NVARCHAR(10)
SET @变量名 = 'test'
SET @sql = 'SELECT * FROM tablename WHERE fieldname LIKE ''%'+ @变量名 +''' ORDER BY FId'
PRINT @sql

------解决方案--------------------


@adminId 转成varchar的


Create proc proc_SetAdminPermissions
@adminId int,
@actions varchar(4000)    
as
begin
    declare @userIfExists int,@sql varchar(500)
    select @userIfExists=COUNT(*) from adminaction where adminid=@adminId
    print @userIfExists 
     
    if(@userIfExists > 0)
    begin
       set @sql = 'update adminaction set actionids='''+@actions +''' where adminid='+cast(@adminId as varchar(50))
    end
    else       
    begin
       set @sql = 'insert into adminaction(adminid,actionids) values('''+cast(@adminId as varchar(50))+''','+rtrim(@actions)+')'
    end
     
    exec(@sql)
end

热点排行