儲存結構讀取不同資料庫中表資訊將存入臨時表

2021-08-10 19:54:39 字數 3719 閱讀 6031

**知識點:

1、字串擷取

2、sql語句拼接

3、動態sql語句

直接上**

第一種方法:(information_schema方法)

begin

declare alltablename varchar(4000);

/*儲存資料庫名和表名的總文字資訊*/

declare tablename varchar(40);

/*儲存解析出來的表名稱*/

declare databasename varchar(30);

/*儲存解析出來的資料庫名稱*/

declare v_sql varchar(200);

/*儲存預編譯sql語句*/

drop table if exists mark_tabletotal;

create temporary table mark_tabletotal(

/*建立資料庫的臨時表,用於臨時儲存查詢出的資訊*/

table_name varchar(40),

table_count int 

);set alltablename ='spprogram.animal,spprogram.books,gmp2.adminuser,';     /*資料庫和資料庫表名的文字,資料庫和表之間用.隔開,兩個字段之間用,隔開*/

while locate(',',alltablename)>0 do

set databasename = substring(alltablename,1,locate('.',alltablename)-1);   /*擷取資料庫名稱*/

set alltablename = substring(alltablename, locate('.',alltablename) + 1);/*擷取完資料庫名稱,將截取出的資料庫名稱從總字段中刪除包括用於和表分隔得.也同時刪除*/

set tablename = substring(alltablename,1, locate(',',alltablename)-1);

/*擷取表名稱*/

set alltablename = substring(alltablename, locate(',',alltablename) + 1);/*擷取表名稱,將截取出的資料庫名稱從總字段中刪除包括用於字段分隔的,也同時刪除*/

/*select *  from  information_schema.tables where table_schema= '資料庫名' and table_name = '名';*/

/*上面的語句用於查詢指定資料庫下指定表的資訊*/

/*動態sql拼接*/

set v_sql = concat('select table_rows into @table_count from  information_schema.tables where table_schema= ''',databasename,''' and table_name = ''',tablename,''';');

set @sql =v_sql;

/*將拼接好的sql語句賦值給乙個變數,******很重要很重要,不可沒有*/

prepare stmt from @sql;   /*預處理需要執行的sql,其中stmt是賦予的名稱*/

execute stmt;

/*執行stmt預處理的語句*/

set tablename = concat(databasename,'.',tablename);

insert into mark_tabletotal values(tablename,@table_count);     /*將查詢出來的表資訊和表名稱,插入到臨時表中*/

end while;

deallocate prepare stmt;     /*釋放掉預處理*/

select * from mark_tabletotal;    /*查詢出臨時表中的資訊*/

drop table mark_tabletotal;     /*刪除掉臨時表*/

end第二種方法:(資料庫名稱.表名,直接鎖定要查詢的表)

begin

declare alltablename varchar(4000);

/*儲存資料庫名和表名的總文字資訊*/

declare tablename varchar(40);/*儲存解析出來的表名稱*//*儲存解析出來的資料庫名稱*/

declare v_sql varchar(200);

/*儲存預編譯sql語句*/

drop table if exists mark_tabletotal;

create temporary table mark_tabletotal(

/*建立資料庫的臨時表,用於臨時儲存查詢出的資訊*/

table_name varchar(40),

table_count int 

);set alltablename ='spprogram.animal,spprogram.books,gmp2.adminuser,';     /*資料庫和資料庫表名的文字,資料庫和表之間用.隔開,兩個字段之間用,隔開*/

while locate(',',alltablename)>0 do

/*substring(str,pos,length)    str代表字串,pos代表從什麼地方開始擷取,length代表擷取長度

locate(substr,str)   返回substr在字串str中第一次出現的點     */

set tablename = substring(alltablename,1, locate(',',alltablename)-1);/*擷取要查詢的書庫局名稱和表名稱*/

set alltablename = substring(alltablename, locate(',',alltablename) + 1);/*將截取出的資料庫名稱和表名稱從總字段中刪除包括用於字段分隔的,也同時刪除*/

/*要理解字串擷取的規則

第一次擷取出來的tablename是'spprogram.animal'   第一次經過擷取的總字串是'spprogram.books,gmp2.adminuser,'

第二次擷取出來的tablename是'

spprogram.books'   第二次經過擷取的總字串

是'gmp2.adminuser,'

*//*動態sql拼接*/

set v_sql = concat('select count(*) into @table_count from ',tablename,';');

set @sql =v_sql;

/*將拼接好的sql語句賦值給乙個變數,******很重要很重要,不可沒有*/

prepare stmt from @sql;   /*預處理需要執行的sql,其中stmt是賦予的名稱*/

execute stmt; /*執行stmt預處理的語句*/

insert into mark_tabletotal values(tablename,@table_count);     /*將查詢出來的表資訊和表名稱,插入到臨時表中*/

end while;

deallocate prepare stmt;     /*釋放掉預處理*/

select * from mark_tabletotal;    /*查詢出臨時表中的資訊*/

drop table mark_tabletotal;     /*刪除掉臨時表*/

end

讀取資料庫中表和列的資訊

讀取庫中的所有庫 select name from master.sysdatabases order by name 讀取庫中的所有表名 select name from master.sysobjects where xtype u order by name 讀取指定表的所有列名 select...

查詢資料庫中表資訊等

有時候需要匯出某使用者下的所有table view sequence trigger等資訊,下面的sql可以將這些資訊select出來 select from user tables select from user views select from user sequences select f...

查詢資料庫中表的資訊

select 表名 case when a.colorder 1 then d.name else end,表說明 case when a.colorder 1 then isnull f.value,else end,字段序號 a.colorder,欄位名 a.name,標識 case when ...