日期:2014-05-18  浏览次数:20590 次

执行存储过程时 提示 "对象名无效(表名)"
如题:执行存储过程时 提示 "对象名无效(表名)" ,请高手赐教!
存储过程定义:
SQL code

CREATE proc CheckLogin 
    @UserName varchar(20) ,@UserPassword varchar(40),
    @Msg varchar(100) output,
    @ResultID bit output
as
begin

    declare @ResultCount int                    /*返回行数*/
    declare @StoredPassWord varchar(40)        /*传递查询得到的密码*/
    
    select @ResultCount =  count(*) from S_UserInfo where UName = @UserName

    if @ResultCount = 0
    begin 
        set @Msg = '用户名不存在,请重新输入!'
        set @ResultID = 0
    end
    else
    begin
        select @StoredPassWord = UPassword from S_UserInfo where UName = @UserName
        if @StoredPassWord = @UserPassword
        begin
            set @Msg = '登录成功!'
            set @ResultID = 1
        end
        else
        begin    
            set @Msg = '密码或用户名错误'
            set @ResultID = 0
        end
    end
end 



执行代码:
SQL code

declare @m varchar(50),@r bit
execute CheckLogin 'aaa','111', @m output,@r output
select @m ,@r



提示错误:
对象名 'S_UserInfo' 无效。



------解决方案--------------------
你的表未创建,或者你未有权限访问这个表,下面的语句执行一下,看看什么结果
SQL code

exec sp_help 'S_UserInfo'

------解决方案--------------------
SQL code
--先确定表S_UserInfo是否存在
--如果存在写成 --库名.所有着.UserInfo 看看你的所有者是什么~~

------解决方案--------------------
探讨
用表的所有者 账号登录 应该有权限访问这个表吧,但是这个存储过程的所有者是dbo 不知道怎么
更改存储过程的所有者?

------解决方案--------------------
探讨
用表的所有者 账号登录 应该有权限访问这个表吧,但是这个存储过程的所有者是dbo 不知道怎么
更改存储过程的所有者?

------解决方案--------------------
单个修改所有者sql语句如下:
查询分析器输入:EXEC sp_changeobjectowner 'user.table', 'dbo'
user.table的意思为:所有者.表名,比如oblog.oblog_user,以上的语句表示将table这张表的所有者由
user改成dbo
量修改所有者语句如下:
查询分析器输入:exec sp_msforeachtable 'sp_changeobjectowner ''?'', ''dbo'''
即可把当面表的所有所有者换成dbo 


------解决方案--------------------
SQL code

CREATE proc CheckLogin 
    @UserName varchar(20) ,@UserPassword varchar(40),
    @Msg varchar(100) output,
    @ResultID bit output
as
begin

    declare @ResultCount int                    /*返回行数*/
    declare @StoredPassWord varchar(40)        /*传递查询得到的密码*/
    
    select @ResultCount =  count(*) from 表所有者.S_UserInfo where UName = @UserName

    if @ResultCount = 0
    begin 
        set @Msg = '用户名不存在,请重新输入!'
        set @ResultID = 0
    end
    else
    begin
        select @StoredPassWord = UPassword from 表所有者.S_UserInfo where UName = @UserName
        if @StoredPassWord = @UserPassword
        begin
            set @Msg = '登录成功!'
            set @ResultID = 1
        end
        else
        begin    
            set @Msg = '密码或用户名错误'
            set @ResultID = 0
        end
    end
end

------解决方案--------------------
你应该是要去修改表所有者为dbo
------解决方案--------------------
探讨
引用:
你应该是要去修改表所有者为dbo

这个正解啊,我该了就可以了.
现在想想 是不是还是把 表的所有者 改回来,然后将存储过程的所有者 改成和表的所有者