多分库多分表(结构相同)脚本创建联合视图

简介:
-- 今天有需要写了一个  
  
  
-- 测试测下:  
CREATE   DATABASE   [ db1 ]    
CREATE   DATABASE   [ db2 ]    
  
USE   [ db1 ]   
CREATE   TABLE   [ dbo ] . [ table1 ] ( [ id ]   [ int ] , [ name ]   [ varchar ] ( 20 ))   
CREATE   TABLE   [ dbo ] . [ table2 ] ( [ id ]   [ int ] , [ name ]   [ varchar ] ( 20 ))   
CREATE   TABLE   [ dbo ] . [ table3 ] ( [ id ]   [ int ] , [ name ]   [ varchar ] ( 20 ))   
  
USE   [ db2 ]   
CREATE   TABLE   [ dbo ] . [ table4 ] ( [ id ]   [ int ] , [ name ]   [ varchar ] ( 20 ))   
CREATE   TABLE   [ dbo ] . [ table5 ] ( [ id ]   [ int ] , [ name ]   [ varchar ] ( 20 ))   
CREATE   TABLE   [ dbo ] . [ table6 ] ( [ id ]   [ int ] , [ name ]   [ varchar ] ( 20 ))   
  
  
  
-- 格式如下(比较规律!):  
select   *   from  db1.dbo.table1  
select   *   from  db1.dbo.table2  
select   *   from  db1.dbo.table3  
  
select   *   from  db2.dbo.table4  
select   *   from  db2.dbo.table5  
select   *   from  db2.dbo.table6  
  
  
select  name  from  master.sys.databases  where  name  like   ' db[0-9]% '   -- 数据库名称格式  
select  name  from  sys.tables  where  name  like   ' table[0-9]% '     -- 表名称格式  
  
  
-- 不是动态创建,需手动指定:数据库格式名。表格式名,视图名称  
  
  
  
  
-- 将数据库名和表名关联  
--
  drop table #db_table  
create   table  #db_table(dbname  varchar ( 50 ),tabname  varchar ( 50 ),mk  bit )   
  
declare   @dbname   varchar ( 50 )  
declare   @exec   varchar ( max )  
set   @exec   =   ''   
declare  cur_db  cursor   for   
select  name  from  master.sys.databases  where  name  like   ' db[0-9]% '   order   by  name  -- 更改数据库名  
open  cur_db  
fetch   next   from  cur_db  into   @dbname   
while   @@FETCH_STATUS   =   0   
begin   
     set   @exec   =   ' select  ''' + @dbname + ''' ,name,0 from [ ' + @dbname + ' ].sys.tables where name like  '' table[0-9]% ''  order by name  ' -- 更改表名  
     insert   into  #db_table  exec ( @exec )  
fetch   next   from  cur_db  into   @dbname   
end   
close  cur_db  
deallocate  cur_db  
  
  
--   select * from #db_table  
--
  update #db_table set mk = 0  
  
  
  
-- 将各表创建合并视图  
set  nocount  on   
declare   @db_name   Nvarchar ( 50 )  
declare   @tab_name   Nvarchar ( 50 )  
declare   @col_name   Nvarchar ( 4000 )  
declare   @sql   Nvarchar ( max )  
declare   @sql1   Nvarchar ( max )  
set   @sql1   =  N ''   
set   @col_name   =  N ''   
set   @sql   =  N '  create view v_table_all  ' + CHAR ( 10 ) + '  as  ' + CHAR ( 10 -- 更改视图名称  
  
while   exists ( select   *   from  #db_table  where  mk = 0 )  
begin   
     select   top   1   @db_name = dbname, @tab_name = tabname  from  #db_table  where  mk = 0    
     set   @col_name   =   ''   
      
     set   @sql1   =  N ' select @col_name = @col_name + name+ '' , ''  from [ ' + @db_name + ' ].sys.columns where object_id=object_id( '' [ ' + @db_name + ' ].dbo.[ ' + @tab_name + ' ] '' ) '   
     exec  sp_executesql  @sql1 ,N ' @col_name varchar(4000) output ' , @col_name   = @col_name  output  
      
     set   @col_name   =   left ( @col_name , LEN ( @col_name ) - 1 )  
  
     set   @sql   =   @sql   +   '  select  ' + @col_name + '  from [ ' + @db_name + ' ].dbo.[ ' + @tab_name + ' ] union all ' + CHAR ( 10 )  
      
     update  #db_table  set  mk  =   1   where  dbname = @db_name   and  tabname = @tab_name   
end   
set   @sql   =   left ( @sql , LEN ( @sql ) - 10 )  
set  nocount  off   
print ( @sql )  
-- exec(@sql)  
  
  
/* --输出结果:  
 create view v_table_all   
 as   
 select id,name from [db1].dbo.[table1] union all  
 select id,name from [db1].dbo.[table2] union all  
 select id,name from [db1].dbo.[table3] union all  
 select id,name from [db2].dbo.[table4] union all  
 select id,name from [db2].dbo.[table5] union all  
 select id,name from [db2].dbo.[table6]   
*/   
目录
相关文章
|
1月前
|
中间件 数据库连接 API
C#数据分表核心代码
C#数据分表核心代码
38 0
|
4月前
|
关系型数据库 分布式数据库 数据库
PolarDB产品使用问题之底层是否会自动对数据库表进行分区分表
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
4月前
|
存储 SQL 缓存
MySQL设计规约问题之为什么要将大字段、访问频率低的字段拆分到单独的表中存储
MySQL设计规约问题之为什么要将大字段、访问频率低的字段拆分到单独的表中存储
|
5月前
|
关系型数据库 PostgreSQL
postgresql如何将没有关联关系的两张表的字段合并
【6月更文挑战第2天】postgresql如何将没有关联关系的两张表的字段合并
150 3
|
6月前
|
关系型数据库 PostgreSQL
postgresql将没有关联关系的两张表合并成一张
【5月更文挑战第4天】postgresql将没有关联关系的两张表合并成一张
235 5
|
5月前
|
关系型数据库 PostgreSQL
postgresql如何将没有关联关系的两张表合并成一张
【6月更文挑战第2天】postgresql如何将没有关联关系的两张表合并成一张
125 0
|
SQL 存储 缓存
霜皮剥落紫龙鳞,下里巴人再谈数据库SQL优化,索引(一级/二级/聚簇/非聚簇)原理
举凡后端面试,面试官不言数据库则已,言则必称SQL优化,说起SQL优化,网络上各种“指南”和“圣经”难以枚举,不一而足,仿佛SQL优化已然是妇孺皆知的理论常识,然后根据多数无知(Pluralistic ignorance)理论,人们印象里觉得多数人会怎么想怎么做,但这种印象往往是不准确的。那SQL优化到底应该怎么做?本次让我们褪去SQL华丽的躯壳,以最浅显,最粗俗,最下里巴人的方式讲解一下SQL优化的前因后果,前世今生。
霜皮剥落紫龙鳞,下里巴人再谈数据库SQL优化,索引(一级/二级/聚簇/非聚簇)原理
|
SQL 中间件 关系型数据库
MyCat - 分片 - 垂直拆分 - 全局表配置 | 学习笔记
快速学习 MyCat - 分片 - 垂直拆分 - 全局表配置
MyCat - 分片 - 垂直拆分 - 全局表配置 | 学习笔记
|
SQL 关系型数据库 MySQL
跨表查询经常有,何为跨表更新?
跨表查询经常有,何为跨表更新?
跨表查询经常有,何为跨表更新?