SQL SERVER 跨库查询,数据库又要能改变,怎么办?

110来电 2007-09-12 02:56:38
我的工程有两个数据库一个主数据库Main,从数据库Plus
我在附加数据库里有些存储过程跨库查询了主库的一些表
比如:select * from Main.dbo.Product inner join Color on ....
现在如果我需要将Main数据库更名,那Plus数据库的存储过程里的内容怎么办?
最好客户自行更改主数据名后,也可以保证存储过程能够正常使用
...全文
490 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
110来电 2007-09-12
  • 打赏
  • 举报
回复
我决定使用匹配数据库的方法,比如两个帐套 DataBase A 对应 DataBase B,DataBase AA 对应
DataBase BB
AA是由A复制过来的,BB是由B复制过来的,本意是复制出一个新帐套,现在写一个批量改存储过程的东东,选择两个数据库使它们"匹配",就是将用到数据库名字的地方全部匹配到新的数据库名。
这样用户只要会备份还原,也可以方便切换帐套或者是开辟新帐套。
大家给点意见,谢谢
nzperfect 2007-09-12
  • 打赏
  • 举报
回复
可以传参数,这个方法的确可以
但是对于已经成规模的数据库来讲,把proc全改成exec @sql又何尝不是一场灾难
我倒觉得批量改存储过程里面的数据库名更适合.

如果有人改数据库名称,而不管其它系统使否使用,那只能是管理问题了.
kelph 2007-09-12
  • 打赏
  • 举报
回复
个人认为动态SQL稳妥些
comszsoft 2007-09-12
  • 打赏
  • 举报
回复
如果数据库名改了是个大问题,修改存储过程这个小问题相对于这个大问题实在小case
Jinglecat 2007-09-12
  • 打赏
  • 举报
回复
但是如果被别人私自改了数据库名字

========

这个不应该属于【程序控制】的范畴,
110来电 2007-09-12
  • 打赏
  • 举报
回复
我现在使用的也是这个办法,基本上可以满足要求,但是如果被别人私自改了数据库名字(没有使用批处理),可能就有问题了,不过这种情况应该几率很小.毕竟更改DB是比较大的改动,谁都不会轻率.
如果没有更好的办法就给你dawugui了,谢谢
dawugui 2007-09-12
  • 打赏
  • 举报
回复
如果你传个不存在的数据库名,那肯定报错.
要么,在传送前检查数据库是否存在,要么跨数据库查询(且在实际应用中)不可取.
Jinglecat 2007-09-12
  • 打赏
  • 举报
回复
dawugui(潇洒老乌龟)

方式是以性能代价来换取

因为它需要动态编译 sql,

且创建 SP 的时候无法检查 目标数据库是否存在,引用的表模式是否正确,
只有运行时你才可以确定,是否有错误

关于动态sql,建议你使用系统存储过程 sp_executeSql 执行, 一定程度上提供性能,因为它会缓存动态编译 sql


关于,问题本身,目前我刚好遇上,
因为我的系统中,多数据库间连接查询很频繁,我很关心性能,
所以我采取的策略是,当开发版本我硬编码了固定的外部数据库名,

当外部数据库名更改的时候,我需要重新修改引用该数据库的存储过程、触发器等等

这也比较容易实现,将你的 sql 导出来,数据库名用占位符替代,
执行此 sql 之前替换实际的数据库名,然后放到查询分析器重新执行即可

写一个部署工具批处理即可


hope helpful

dawugui 2007-09-12
  • 打赏
  • 举报
回复
如果数据库名要变的话,除了动态SQL,我想不出其他办法了.

帮顶.
110来电 2007-09-12
  • 打赏
  • 举报
回复
动态SQL的确可以实现,但是就失去了使用存储过程的预先编译的优点,而且写起来也比较痛苦
还有没有更好的办法
fengming2222 2007-09-12
  • 打赏
  • 举报
回复
或把db做为一个参数传给这个存储过程.
dawugui 2007-09-12
  • 打赏
  • 举报
回复
CREATE PROCEDURE my_pro @dbname varchar(10)
as
begin
declare @sql as varchar(100)
set @sql = 'select * from ' + @dbname + '.dbo.Product inner join Color on ....'
exec(@sql)
end
go

execute my_pro 'main'
dawugui 2007-09-12
  • 打赏
  • 举报
回复
我的工程有两个数据库一个主数据库Main,从数据库Plus
我在附加数据库里有些存储过程跨库查询了主库的一些表
比如:select * from Main.dbo.Product inner join Color on ....
现在如果我需要将Main数据库更名,那Plus数据库的存储过程里的内容怎么办?
最好客户自行更改主数据名后,也可以保证存储过程能够正常使用

declare @sql as varchar(100)
declare @db as varchar(10)
set @db = '更改的数据库名'
set @sql = 'select * from ' + @db + '.dbo.Product inner join Color on ....'
exec(@sql)

或把db做为一个参数传给这个存储过程.

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧