问题描述
出错的地方当一运行的时候出现错误提示对象名'dbo.fn_GetFilePath'无效。这是怎么会事,郁闷好久了,希望高手指点一下=============================以下是存储过程=============================CREATEprocEyeSystemDataBackReturn@bkfilenvarchar(1000),--定义要恢复的备份文件名@dbnamesysname='',--定义恢复后的数据库名,默认为备份的文件名@dbpathnvarchar(260)='',--恢复后的数据库存放目录,不指定则为SQL的默认数据目录@retypenvarchar(10)='DB',--恢复类型:'DB'完事恢复数据库,'DBNOR'为差异恢复,日志恢复进行完整恢复,'DF'差异备份的恢复,'LOG'日志恢复@filenumberint=1,--恢复的文件号@overexistbit=1,--是否覆盖已经存在的数据库,仅@retype为@killuserbit=1--是否关闭用户使用进程,仅@overexist=1时有效asdeclare@sqlvarchar(8000)--得到恢复后的数据库名ifisnull(@dbname,'')=''select@sql=reverse(@bkfile),@sql=casewhencharindex('.',@sql)=0then@sqlelsesubstring(@sql,charindex('.',@sql)+1,1000)end,@sql=casewhencharindex('',@sql)=0then@sqlelseleft(@sql,charindex('',@sql)-1)end,@dbname=reverse(@sql)--得到恢复后的数据库存放目录ifisnull(@dbpath,'')=''set@dbpath=dbo.f_getdbpath('')--生成数据库恢复语句set@sql='restore'+case@retypewhen'LOG'then'log'else'database'end+@dbname+'fromdisk='''+@bkfile+''''+'withfile='+cast(@filenumberasvarchar)+casewhen@overexist=1and@retypein('DB','DBNOR')then',replace'else''end+case@retypewhen'DBNOR'then',NORECOVERY'else',RECOVERY'endprint@sql--添加移动逻辑文件的处理if@retype='DB'or@retype='DBNOR'begin--从备份文件中获取逻辑文件名declare@lfnnvarchar(128),@tpchar(1),@iint--创建临时表,保存获取的信息createtable#tb(lnnvarchar(128),pnnvarchar(260),tpchar(1),fgnnvarchar(128),sznumeric(20,0),Msznumeric(20,0))--从备份文件中获取信息insertinto#tbexec('restorefilelistonlyfromdisk='''+@bkfile+'''')declare#fcursorforselectln,tpfrom#tbopen#ffetchnextfrom#finto@lfn,@tpset@i=0while@@fetch_status=0beginselect@sql=@sql+',move'''+@lfn+'''to'''+@dbpath+@dbname+cast(@iasvarchar)+case@tpwhen'D'then'.mdf'''else'.ldf'''end,@i=@i+1fetchnextfrom#finto@lfn,@tpendclose#fdeallocate#fend--关闭用户进程处理if@overexist=1and@killuser=1begindeclare@spidvarchar(20)declare#spidcursorforselectspid=cast(spidasvarchar(20))frommaster..sysprocesseswheredbid=db_id(@dbname)open#spidfetchnextfrom#spidinto@spidwhile@@fetch_status=0beginexec('kill'+@spid)fetchnextfrom#spidinto@spidendclose#spiddeallocate#spidend--恢复数据库exec(@sql)GO=============================以下是操纵备份ASP.NET代码publicstaticboolReturnDataBack(){SqlConnectioncon=DataCon.DataBaseCon();con.Open();SqlCommandcmd=newSqlCommand("EyeSystemDataBackReturn",con);cmd.CommandType=CommandType.StoredProcedure;SqlParameterbkfile=newSqlParameter("@bkfile",SqlDbType.NVarChar,1000);bkfile.Value=System.Web.HttpContext.Current.Server.MapPath("../DataBase/bithsyk.bak");cmd.Parameters.Add(bkfile);cmd.ExecuteNonQuery();cmd.Dispose();con.Close();con.Dispose();returnfalse;}===================
解决方案
解决方案二:
在查询分析器中运行了一下存储过程execEyeSystemDataBackReturn'C:InetpubwwwrootHsyk_eyeDataBasebithsyk.bak'提示错误:服务器:消息208,级别16,状态1,过程EyeSystemDataBackReturn,行22对象名'dbo.f_getdbpath'无效。
解决方案三:
'dbo.fn_GetFilePath'是个用户自定义函数,你没有定义当然出错了,看看你在什么地方调用过它
解决方案四:
--得到恢复后的数据库存放目录ifisnull(@dbpath,'')=''set@dbpath=dbo.f_getdbpath('')
这是用户自定义函数,不是系统函数,需要你自己定义的。
解决方案五:
OK了我试验一下!
解决方案六:
这个位置需要怎么定义?指点一下可以吗?ifisnull(@dbpath,'')=''set@dbpath=dbo.f_getdbpath('')脑子有点乱,比较复杂
解决方案七:
up
解决方案八:
看着头晕。。飘过。。UP一下
解决方案九:
up
解决方案十:
createfunctionf_getdbpath(@dbnamesysname)returnsnvarchar(260)asbegindeclare@renvarchar(260)if@dbnameisnullordb_id(@dbname)isnullselect@re=rtrim(reverse(filename))frommaster..sysdatabaseswherename='master'elseselect@re=rtrim(reverse(filename))frommaster..sysdatabaseswherename=@dbnameif@dbnameisnullset@re=reverse(substring(@re,charindex('',@re)+5,260))+'BACKUP'elseset@re=reverse(substring(@re,charindex('',@re),260))return(@re)end
解决方案十一:
这个添加在存储过程中?
解决方案十二:
你写的这个,怎么用呀
解决方案十三:
不知道createfunction什么意思吗?你还是不要动不动就抄代码了,先去看看基本知识吧。
解决方案十四:
我是以一次接触,输出还原备份的操作
解决方案十五:
createfunction是最基本的sql语句,这个和还原备份没什么关系
解决方案:
自定义函数,我添加进去了!
解决方案:
在数据库'master'中拒绝了CREATEDATABASE权限。权限问题吗?
解决方案:
引用2楼jinjazz的回复:
'dbo.fn_GetFilePath'是个用户自定义函数,你没有定义当然出错了,看看你在什么地方调用过它
解决方案:
用sa登陆
解决方案:
在数据库'master'中拒绝了CREATEDATABASE权限。RESTOREDATABASE操作异常终止。restoredatabasebithsykfromdisk='c:inetpubwwwrootHsyk_eyeDataBasebithsyk.bak'withfile=1,replace,RECOVERY权限问题吧!
解决方案:
现在不出错了!但数据库没回复呀!
解决方案:
楼主,给你个建议,有时候不能照搬别人的代码,要尝试着修改成适合自己的代码,就像那个自定义函数。
解决方案:
晓得了,谢谢你们大家的意见!
解决方案:
对象名'dbo.f_getdbpath'无效。没有定义