リレーションシップ設定ツール

 


(8.0.29)


drop procedure proc_makeER;
delimiter //
create procedure proc_makeER()
begin

 

-- ワーク変数
declare wk1 numeric;
declare wk2 numeric;
declare wk3 numeric;
declare wk4 numeric;
declare wk5 numeric;
declare wk6 numeric;


declare va1 varchar(4000);
declare va2 varchar(4000);
declare va3 varchar(4000);
declare va4 varchar(4000);


-- カーソル関連
declare done int;

declare cur10 cursor for select table_name from information_schema.tables 
                                            where table_schema='test'
                                            and table_type = 'BASE TABLE'
                                            order by rand() limit 2;

 

declare continue handler for sqlstate '02000' set done = 1;


-- テーブル名配列
drop temporary table if exists tabnames;
create temporary table if not exists tabnames(id int primary key auto_increment
                                           ,table_name     varchar(4000)
                                           );

 

-- 結合条件配列
drop temporary table if exists joincols;
create temporary table if not exists joincols(id int primary key auto_increment
                                           ,table_name1  varchar(4000)
                                           ,table_name2  varchar(4000)
                                           ,column_name1 varchar(30)
                                           ,column_name2 varchar(30)
                                           );


  -- ①テーブル名配列にテーブルを格納

set wk1 = 1;
set done = 0;
open cur10;
fetch cur10 into va1;
while done != 1 do
  insert into tabnames(table_name) values(va1);
  set wk1 = wk1+1;
  fetch cur10 into va1;
end while;
close cur10;


set va1 := (select table_name from tabnames where id = 1);
set va2 := (select table_name from tabnames where id = 2);

 

  -- ②結合条件配列の作成

set @q := '';
set @column_name1 :='';
set @column_name2 :='';


set @q := concat(@q, ' select t1.column_name , t2.column_name  into @column_name1,@column_name2 ');
set @q := concat(@q, ' from information_schema.columns t1 ');
set @q := concat(@q, ' inner join information_schema.columns t2 ');
set @q := concat(@q, ' on t1.data_type = t2.data_type ');
set @q := concat(@q, ' and coalesce(t1.character_maximum_length,-1) = coalesce(t2.character_maximum_length,-1) ');
set @q := concat(@q, ' and coalesce(t1.numeric_precision,-1) = coalesce(t2.numeric_precision,-1) ');
set @q := concat(@q, ' and coalesce(t1.numeric_scale,-1) = coalesce(t2.numeric_scale,-1) ');
set @q := concat(@q, ' and t1.table_schema = ''test'' ');
set @q := concat(@q, ' and t1.table_name = ''',va1,''' ');
set @q := concat(@q, ' and t2.table_schema = ''test'' ');
set @q := concat(@q, ' and t2.table_name = ''',va2,''' ');
  -- 主キーとユニークインデックスカラムは除外
set @q := concat(@q, ' and not exists ( select 1 ');
set @q := concat(@q, ' from information_schema.statistics ');
set @q := concat(@q, ' where NON_UNIQUE = 0 ');
set @q := concat(@q, ' and table_schema = t1.table_schema ');
set @q := concat(@q, ' and table_name = t1.table_name ');
set @q := concat(@q, ' and column_name = t1.column_name ) ');
set @q := concat(@q, ' and not exists ( select 1 ');
set @q := concat(@q, ' from information_schema.statistics ');
set @q := concat(@q, ' where NON_UNIQUE = 0 ');
set @q := concat(@q, ' and table_schema = t2.table_schema ');
set @q := concat(@q, ' and table_name = t2.table_name ');
set @q := concat(@q, ' and column_name = t2.column_name ) ');
set @q := concat(@q, ' order by rand() ');
set @q := concat(@q, ' limit 1 ');

prepare stmt from @q;
execute stmt;
deallocate prepare stmt;

insert into joincols(table_name1,table_name2,column_name1,column_name2) select va1,va2,@column_name1,@column_name2;

select * from joincols;

  -- ③リレーションシップ設定SQLの作成と実行

set wk6 := (select count(*) from joincols where column_name1 != '' and column_name2 != '');

if wk6 > 0 then

  -- テーブル件数取得

  set @q := concat(' select count(*) into @count from ',va1);
  prepare stmt from @q;
  execute stmt;
  deallocate prepare stmt;

  set wk1 := @count;

  set @q := concat(' select count(*) into @count from ',va2);
  prepare stmt from @q;
  execute stmt;
  deallocate prepare stmt;

  set wk2 := @count;


    -- va1 -> 件数が少ないテーブルのテーブル名
    -- va2 -> 件数が多いテーブルのテーブル名
    -- va3 -> 件数が少ないテーブルのカラム名
    -- va4 -> 件数が多いテーブルのカラム名
    -- wk3 -> 少ないほうの件数
    -- wk4 -> 多いほうの件数

  if wk1 < wk2 then
    set va1 := (select table_name1 from joincols);
    set va2 := (select table_name2 from joincols);
    set va3 := (select column_name1 from joincols);
    set va4 := (select column_name2 from joincols);
    set wk3 := wk1;
    set wk4 := wk2;
  else
    set va1 := (select table_name2 from joincols);
    set va2 := (select table_name1 from joincols);
    set va3 := (select column_name2 from joincols);
    set va4 := (select column_name1 from joincols);
    set wk3 := wk2;
    set wk4 := wk1;
  end if;

  select va1,va2,va3,va4,wk3,wk4;


  set @q := concat(' alter table ',va1,' add カラム1 integer ');
  prepare stmt from @q;
  execute stmt;
  deallocate prepare stmt;

  set @q := concat(' alter table ',va2,' add カラム2 integer ');
  prepare stmt from @q;
  execute stmt;
  deallocate prepare stmt;


  set wk5 := 0;
  while wk5 <= wk3 do
    set @q := concat(' update ',va1,' set カラム1 = ',wk5,'  where カラム1 is null limit 1 ');
    prepare stmt from @q;
    execute stmt;
    deallocate prepare stmt;
    set wk5 := wk5+1;
  end while;


  set wk5 := 0;
  while wk5 <= wk4 do
    set @q := concat(' update ',va2,' set カラム2 = mod(',wk5,',',wk3,')  where カラム2 is null limit 1 ');
    prepare stmt from @q;
    execute stmt;
    deallocate prepare stmt;
    set wk5 := wk5+1;
  end while;


  set @q := concat(' update ',va2,' set ',va4,' = ( select ',va3,' from ',va1,' where カラム1 = ',va2,'.カラム2 ) ');
  prepare stmt from @q;
  execute stmt;
  deallocate prepare stmt;


  set @q := concat(' alter table ',va1,' drop カラム1 ');
  prepare stmt from @q;
  execute stmt;
  deallocate prepare stmt;

  set @q := concat(' alter table ',va2,' drop カラム2 ');
  prepare stmt from @q;
  execute stmt;
  deallocate prepare stmt;

end if;

end
//
delimiter ;

 

drop procedure main;

delimiter //
create procedure main()
begin

declare loop_num numeric default 5;   -- proc_makeER実行回数
declare wk1 numeric default 1;

while wk1 <= loop_num do
  call proc_makeER;
  set wk1 = wk1+1;
end while;

end
//
delimiter ;

call main;

 


(19c)

 


set serveroutput on
create or replace procedure proc_makeER
as

-- テーブル名配列
type rec10 is record(
   table_name     varchar2(4000)
  );

type ar10 is table of rec10 index by binary_integer;
tabnames ar10 := ar10();


-- 結合条件配列
type rec40 is record(
   table_name1    varchar2(4000)
  ,table_name2    varchar2(4000)
  ,column_name1   varchar2(30)
  ,column_name2   varchar2(30)
  );

type ar40 is table of rec40 index by binary_integer;
joincols  ar40 := ar40();


-- ワーク変数
wk1 number;
wk2 number;
wk3 number;


va1 varchar2(4000);
va2 varchar2(4000);
va3 varchar2(4000);
va4 varchar2(4000);


-- SQL
vsql        varchar2(4000);


begin


  -- ①テーブル名配列にテーブルを格納
  wk1 := 1;
  for c1 in ( select table_name from user_tables order by dbms_random.random fetch first 2 rows only ) loop
    tabnames(wk1).table_name := c1.table_name;
    wk1 := wk1+1;
  end loop;

  dbms_output.put_line('---tabnames---' );
  for i in 1..tabnames.count loop
    dbms_output.put_line( tabnames(i).table_name  );
  end loop;

 

  -- ②結合条件配列の作成


  vsql :='';
  va1 := '';
  va2 := '';

  vsql := vsql || ' select t1.column_name column_name1, t2.column_name column_name2 ';
  vsql := vsql || ' from user_tab_cols t1 ';
  vsql := vsql || ' inner join user_tab_cols t2 ';
  vsql := vsql || ' on t1.data_type = t2.data_type ';
  vsql := vsql || ' and nvl(t1.data_length,-1) = nvl(t2.data_length,-1) ';
  vsql := vsql || ' and nvl(t1.data_precision,-1) = nvl(t2.data_precision,-1) ';
  vsql := vsql || ' and nvl(t1.data_scale,-1) = nvl(t2.data_scale,-1) ';
  vsql := vsql || ' and t1.table_name = '''|| tabnames(1).table_name ||''' ';
  vsql := vsql || ' and t2.table_name = '''|| tabnames(2).table_name ||''' ';

  -- 主キーとユニークインデックスカラムは除外

  vsql := vsql || ' and not exists ( select 1 ';
  vsql := vsql || ' from user_indexes t3 ';
  vsql := vsql || ' inner join user_ind_columns t4 ';
  vsql := vsql || ' on t3.index_name = t4.index_name ';
  vsql := vsql || ' where t3.UNIQUENESS = ''UNIQUE'' ';
  vsql := vsql || ' and t4.table_name = t1.table_name ';
  vsql := vsql || ' and t4.column_name = t1.column_name ) ';

  vsql := vsql || ' and not exists ( select 1 ';
  vsql := vsql || ' from user_indexes t3 ';
  vsql := vsql || ' inner join user_ind_columns t4 ';
  vsql := vsql || ' on t3.index_name = t4.index_name ';
  vsql := vsql || ' where t3.UNIQUENESS = ''UNIQUE'' ';
  vsql := vsql || ' and t4.table_name = t2.table_name ';
  vsql := vsql || ' and t4.column_name = t2.column_name ) ';

  vsql := vsql || ' order by dbms_random.random ';
  vsql := vsql || ' fetch first 1 rows only ';


  begin
    execute immediate vsql into va1,va2;
  exception when others then
    return;
  end;

  joincols(1).table_name1 := tabnames(1).table_name;
  joincols(1).table_name2 := tabnames(2).table_name;
  joincols(1).column_name1 := va1;
  joincols(1).column_name2 := va2;

 

  dbms_output.put_line('---joincols---' );
  for i in 1..joincols.count loop
    dbms_output.put_line( joincols(i).table_name1 || ','||
                          joincols(i).table_name2 || ','||
                          joincols(i).column_name1 || ','||
                          joincols(i).column_name2  );
  end loop;

  -- ③リレーションシップ設定SQLの作成と実行

  -- テーブル件数取得

  vsql := ' select count(*) from ' ||  joincols(1).table_name1;
  execute immediate vsql into wk1;

  vsql := ' select count(*) from ' ||  joincols(1).table_name2;
  execute immediate vsql into wk2;


-- va1 -> 件数が少ないテーブルのテーブル名
-- va2 -> 件数が多いテーブルのテーブル名
-- va3 -> 件数が少ないテーブルのカラム名
-- va4 -> 件数が多いテーブルのカラム名

-- wk3 -> 少ないほうの件数

  if wk1 < wk2 then
    va1 := joincols(1).table_name1;
    va2 := joincols(1).table_name2;
    va3 := joincols(1).column_name1;
    va4 := joincols(1).column_name2;
    wk3 := wk1;
  else
    va1 := joincols(1).table_name2;
    va2 := joincols(1).table_name1;
    va3 := joincols(1).column_name2;
    va4 := joincols(1).column_name1;
    wk3 := wk2;
  end if;


  vsql := ' alter table '|| va1 ||' add カラム1 integer ';
  execute immediate vsql;

  vsql := ' alter table '|| va2 ||' add カラム2 integer ';
  execute immediate vsql;

  vsql := ' update ' || va1 || ' set カラム1 = rownum - 1 ';
  execute immediate vsql;

  vsql := ' update ' || va2 || ' set カラム2 = mod(rownum-1,'|| wk3 ||') ';
  execute immediate vsql;

  vsql := ' update ' || va2 ||' set ' || va4 || ' = ( select ' || va3 || ' from ' || va1 || ' where カラム1 = ' || va2 || '.カラム2 ) ';
  execute immediate vsql;

  vsql := ' alter table ' || va1 || ' drop ( カラム1 ) ';
  execute immediate vsql;

  vsql := ' alter table ' || va2 || ' drop ( カラム2 ) ';
  execute immediate vsql;

 

end;
/
sho error;

 

create or replace procedure main
as

loop_num number := 5;   -- proc_makeER実行回数

begin
  for i in 1..loop_num loop
    proc_makeER;
  end loop;
end;
/
show error;


exec main;

 

(15)

 


drop type if exists rec10 CASCADE;
create type rec10 as(
   table_name                  varchar(4000)
  );


drop type if exists rec40 CASCADE;
create type rec40 as(
   table_name1   varchar(4000)
  ,table_name2   varchar(4000)
  ,column_name1  varchar(30)
  ,column_name2  varchar(30)
  );


drop procedure proc_makeER;

create or replace procedure proc_makeER()
language plpgsql
as $$
declare

-- テーブル名配列
tabnames rec10;


-- 結合条件配列
joincols  rec40;

-- ワーク変数
r1   record;

wk1 numeric;
wk2 numeric;
wk3 numeric;

va1 varchar(4000);
va2 varchar(4000);
va3 varchar(4000);
va4 varchar(4000);


-- SQL
vsql varchar(4000);


begin

  -- ①テーブル名配列にテーブルを格納
  wk1 := 1;
  for r1 in ( select tablename from pg_tables where schemaname = 'public' order by random() limit 2 ) loop
    tabnames[wk1].table_name := r1.tablename;
    wk1 := wk1+1;
  end loop;
  
  raise notice  '---tabnames---';
  for i in 1..array_upper(tabnames, 1) loop
    raise notice 'tabnames[%]: %',i,tabnames[i].table_name;
  end loop;

  -- ②結合条件配列の作成

  vsql := '';
  va1 := '';
  va2 := '';

  vsql := vsql || ' select t1.column_name column_name1, t2.column_name column_name2 ';
  vsql := vsql || ' from information_schema.columns t1 ';
  vsql := vsql || ' inner join information_schema.columns t2 ';
  vsql := vsql || ' on t1.data_type = t2.data_type ';
  vsql := vsql || ' and coalesce(t1.character_maximum_length,-1) = coalesce(t2.character_maximum_length,-1) ';
  vsql := vsql || ' and coalesce(t1.numeric_precision,-1) = coalesce(t2.numeric_precision,-1) ';
  vsql := vsql || ' and coalesce(t1.numeric_scale,-1) = coalesce(t2.numeric_scale,-1) ';
  vsql := vsql || ' and t1.table_catalog = ''test'' ';
  vsql := vsql || ' and t1.table_schema = ''public'' ';
  vsql := vsql || ' and t1.table_name = '''||tabnames[1].table_name||''' ';
  vsql := vsql || ' and t2.table_catalog = ''test'' ';
  vsql := vsql || ' and t2.table_schema = ''public'' ';
  vsql := vsql || ' and t2.table_name = '''||tabnames[2].table_name||''' ';
  -- 主キーとユニークインデックスカラムは除外
  vsql := vsql || ' and  not exists ( ';
  vsql := vsql || '   select 1 ';
  vsql := vsql || '   from pg_indexes ';
  vsql := vsql || '   where schemaname = ''public'' ';
  vsql := vsql || '   and tablename = t1.table_name ';
  vsql := vsql || '   and indexdef like ''%UNIQUE%'' ';
  vsql := vsql || '   and ( indexdef like ''%''|| t1.column_name ||'',%'' or indexdef like ''%''|| t1.column_name ||'')%'' ) ';
  vsql := vsql || ' ) ';
  vsql := vsql || ' and  not exists ( ';
  vsql := vsql || '   select 1 ';
  vsql := vsql || '   from pg_indexes ';
  vsql := vsql || '   where schemaname = ''public'' ';
  vsql := vsql || '   and tablename = t2.table_name ';
  vsql := vsql || '   and indexdef like ''%UNIQUE%'' ';
  vsql := vsql || '   and ( indexdef like ''%''|| t2.column_name ||'',%'' or indexdef like ''%''|| t2.column_name ||'')%'' ) ';
  vsql := vsql || ' ) ';
  vsql := vsql || ' order by random() limit 1 ';


  execute vsql into va1,va2;

  -- raise notice  'va1=%,va2=%' ,va1, va2;

  if va1 is null or va2 is null then
    return;
  end if;

  joincols[1].table_name1 := tabnames[1].table_name;
  joincols[1].table_name2 := tabnames[2].table_name;
  joincols[1].column_name1 := va1;
  joincols[1].column_name2 := va2;


  -- ③リレーションシップ設定SQLの作成と実行

  -- テーブル件数取得
  wk1 := 0;
  wk2 := 0;
  
  vsql := 'select count(*) from ' || joincols[1].table_name1;
  execute vsql into wk1;

  vsql := 'select count(*) from ' || joincols[1].table_name2;
  execute vsql into wk2;

-- va1 -> 件数が少ないテーブルのテーブル名
-- va2 -> 件数が多いテーブルのテーブル名
-- va3 -> 件数が少ないテーブルのカラム名
-- va4 -> 件数が多いテーブルのカラム名

-- wk3 -> 少ないほうの件数

  if wk1 < wk2 then
    va1 := joincols[1].table_name1;
    va2 := joincols[1].table_name2;
    va3 := joincols[1].column_name1;
    va4 := joincols[1].column_name2;
    wk3 := wk1;
  else
    va1 := joincols[1].table_name2;
    va2 := joincols[1].table_name1;
    va3 := joincols[1].column_name2;
    va4 := joincols[1].column_name1;
    wk3 := wk2;
  end if;


  raise notice  'va1=%,va2=%,va3=%,va4=%,wk3=%' ,va1, va2, va3, va4, wk3;


  vsql := ' alter table '|| va1 ||' add カラム1 integer ';
  execute vsql;

  vsql := ' alter table '|| va2 ||' add カラム2 integer ';
  execute vsql;

  vsql := '';
  vsql := vsql || ' update '||va1||' t0 set カラム1 = ( select count(t2.ctid) ';
  vsql := vsql || ' from '||va1||' t1 left join '||va1||' t2 ';
  vsql := vsql || ' on t1.ctid > t2.ctid ';
  vsql := vsql || ' where t1.ctid = t0.ctid ) ';
  execute vsql;

  vsql := '';
  vsql := vsql || ' update '||va2||' t0 set カラム2 = ( select mod(count(t2.ctid),'||wk3||') ';
  vsql := vsql || ' from '||va2||' t1 left join '||va2||' t2 ';
  vsql := vsql || ' on t1.ctid > t2.ctid ';
  vsql := vsql || ' where t1.ctid = t0.ctid ) ';
  execute vsql;

  vsql := ' update ' || va2 ||' set ' || va4 || ' = ( select ' || va3 || ' from ' || va1 || ' where カラム1 = ' || va2 || '.カラム2 ) ';
  execute  vsql;

vsql := ' alter table ' || va1 || ' drop カラム1 ';
execute  vsql;

vsql := ' alter table ' || va2 || ' drop カラム2 ';
execute  vsql;

end;
$$;

create or replace procedure main()
language plpgsql
as $$
declare

loop_num numeric := 5;   -- proc_makeER実行回数

 

begin


  for i in 1..loop_num loop
    call proc_makeER();

  end loop;


end;
$$;


call main();

 

 

(2019)

 


create or alter procedure proc_makeER
as
begin
set nocount on;


-- ワーク変数
declare @wk1 numeric;
declare @wk2 numeric;
declare @wk3 numeric;
declare @wk4 numeric;


declare @va1 varchar(4000);
declare @va2 varchar(4000);
declare @va3 varchar(4000);
declare @va4 varchar(4000);


-- SQL
declare @vsql nvarchar(4000);

-- テーブル名配列
declare @tabnames table(id int identity(1,1)
                       ,table_name    varchar(4000) 
                       );

-- 結合条件配列
declare @joincols table(id int identity(1,1)
                       ,table_name1   varchar(4000)
                       ,table_name2   varchar(4000)
                       ,column_name1  varchar(30)
                       ,column_name2  varchar(30)
                       );


  -- ①テーブル名配列にテーブルを格納
declare cur10 cursor for select table_name from INFORMATION_SCHEMA.TABLES order by newid();

set @wk1 = 1;
open cur10;
fetch next from cur10 into @va1;
while @@fetch_status = 0
begin
  insert into @tabnames(table_name) values(@va1);
  fetch next from cur10 into @va1;
  set @wk1 = @wk1+1;
  if @wk1 > 2
    break;
  
end
close cur10;
deallocate cur10;

 

set @va1 = (select table_name from @tabnames where id = 1);
set @va2 = (select table_name from @tabnames where id = 2);

set @vsql = N'';
set @va3 ='';
set @va4 ='';

  -- ②結合条件配列の作成

set @vsql = @vsql+ N' select top(1) @va3 = t1.name , @va4 = t2.name ';
set @vsql = @vsql+ N' from sys.columns t1 ';
set @vsql = @vsql+ N' inner join sys.columns t2 ';
set @vsql = @vsql+ N' on t1.system_type_id = t2.system_type_id ';
set @vsql = @vsql+ N' and coalesce(t1.max_length,-1) = coalesce(t2.max_length,-1) ';
set @vsql = @vsql+ N' and coalesce(t1.precision,-1) = coalesce(t2.precision,-1) ';
set @vsql = @vsql+ N' and coalesce(t1.scale,-1) = coalesce(t2.scale,-1) ';
set @vsql = @vsql+ N' and object_name(t1.object_id) ='''+@va1+''' ';
set @vsql = @vsql+ N' and object_name(t2.object_id) ='''+@va2+''' ';
  -- 主キーとユニークインデックスカラムは除外
set @vsql = @vsql+ N' and not exists ( select 1 ';
set @vsql = @vsql+ N'   from sys.indexes t3 ';
set @vsql = @vsql+ N'   inner join sys.index_columns t4 ';
set @vsql = @vsql+ N'   on t3.object_id = t4.object_id ';
set @vsql = @vsql+ N'   and t3.index_id = t4.index_id ';
set @vsql = @vsql+ N'   where t3.is_unique = 1 ';
set @vsql = @vsql+ N'   and object_name(t3.object_id) = object_name(t1.object_id) ';
set @vsql = @vsql+ N'   and col_name(t4.object_id,t4.column_id) = t1.name ) ';
set @vsql = @vsql+ N' and not exists ( select 1 ';
set @vsql = @vsql+ N'   from sys.indexes t3 ';
set @vsql = @vsql+ N'   inner join sys.index_columns t4 ';
set @vsql = @vsql+ N'   on t3.object_id = t4.object_id ';
set @vsql = @vsql+ N'   and t3.index_id = t4.index_id ';
set @vsql = @vsql+ N'   where t3.is_unique = 1 ';
set @vsql = @vsql+ N'   and object_name(t3.object_id) = object_name(t2.object_id) ';
set @vsql = @vsql+ N'   and col_name(t4.object_id,t4.column_id) = t2.name ) ';
set @vsql = @vsql+ N' order by newid() ';

execute sp_executesql
  @vsql,
  N'@va3 varchar(4000) OUT,@va4 varchar(4000) OUT', @va3 OUT, @va4 OUT;


insert into @joincols(table_name1,table_name2,column_name1,column_name2) select @va1,@va2,@va3,@va4;
select * from @joincols;

  -- ③リレーションシップ設定SQLの作成と実行

set @wk4 = (select count(*) from @joincols where column_name1 != '' and column_name2 != '');


if @wk4 = 0
  return;
  
  -- テーブル件数取得
set @vsql = N'select @wk1 = count(*) from ';
set @vsql = @vsql+ @va1;

execute sp_executesql
  @vsql,
  N'@wk1 numeric OUT', @wk1 OUT;

set @vsql = N'select @wk2 = count(*) from ';
set @vsql = @vsql+ @va2;

execute sp_executesql
  @vsql,
  N'@wk2 numeric OUT', @wk2 OUT;

 

    -- va1 -> 件数が少ないテーブルのテーブル名
    -- va2 -> 件数が多いテーブルのテーブル名
    -- va3 -> 件数が少ないテーブルのカラム名
    -- va4 -> 件数が多いテーブルのカラム名
    -- wk3 -> 少ないほうの件数

if @wk1 < @wk2
  begin
    set @va1 = (select table_name1 from @joincols);
    set @va2 = (select table_name2 from @joincols);
    set @va3 = (select column_name1 from @joincols);
    set @va4 = (select column_name2 from @joincols);
    set @wk3 = @wk1;
  end;
else
  begin
    set @va1 = (select table_name2 from @joincols);
    set @va2 = (select table_name1 from @joincols);
    set @va3 = (select column_name2 from @joincols);
    set @va4 = (select column_name1 from @joincols);
    set @wk3 = @wk2;
  end;

print @va1+','+@va2+','+@va3+','+@va4+','+cast(@wk3 as varchar);


set @vsql = ' alter table '+@va1+' add カラム0 bigint identity(0,1) ';
execute(@vsql);

set @vsql = ' alter table '+@va2+' add カラム0 bigint identity(0,1) ';
execute(@vsql);

set @vsql = ' alter table '+@va1+' add カラム1 integer ';
execute(@vsql);

set @vsql = ' alter table '+@va2+' add カラム2 integer ';
execute(@vsql);


set @vsql = ' update '+@va1+' set カラム1 = カラム0 ';
execute(@vsql);

set @vsql = ' update '+@va2+' set カラム2 = カラム0 %'+cast(@wk3 as varchar);
execute(@vsql);


set @vsql = ' update '+@va2+' set '+@va4+' = ( select '+@va3+' from '+@va1+' where カラム1 = '+@va2+'.カラム2 ) ';
execute(@vsql);


set @vsql = ' alter table '+@va1+' drop column カラム1 ';
execute(@vsql);

set @vsql = ' alter table '+@va2+' drop column カラム2 ';
execute(@vsql);


set @vsql = ' alter table '+@va1+' drop column カラム0 ';
execute(@vsql);

set @vsql = ' alter table '+@va2+' drop column カラム0 ';
execute(@vsql);


end
go


create or alter procedure main
as
begin

declare @loop_num numeric = 5;   -- proc_makeER実行回数
declare @wk1 numeric = 1;

while @wk1 <= @loop_num
begin
  exec proc_makeER;
  set @wk1 = @wk1+1;
end;


end
go


exec main