栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

SqlServer自动生成Hive建表语句

SqlServer自动生成Hive建表语句

1.建一张存储生成的SQL语句。
 create table T_SQL
(
  scsj       DATE,
  sqlyj      text,
  table_name VARCHAR(100) not null,
  mxyj       text
)
2.创建一张表,用来存储源表的结构,以便进行数据处理
 create table T_P_TABLE_NAME_TEMP
 (
   table_name   VARCHAR(30) not null,
   column_name  VARCHAR(30) not null,
   data_type    VARCHAR(106),
 );
3.创建存储过程,用于添加映射关系数据及生成创表语句等

(注意修改数据库名)

create PROCEDURE   [数据库名].[P_DDPT_SQL_INIT]
@p_table_name AS varchar(max), --输入表名,必须大写
@p_error_no   AS int, --错误编号
@p_error_info AS varchar  --错误信息
                                           

--调度平台 建表语句生成
AS 
  DECLARE @nb_begindate date;
  DECLARE @nb_enddate   date;
  DECLARE @v_count      int;
  DECLARE @v_update_sql varchar(max);
  DECLARE @v_temp_sql varchar(max);
  DECLARE @v_detail_sql varchar(max);
  DECLARE @v_out_sql varchar(max);
  DECLARE @v_owner varchar(2000);
  DECLARE @v_table_name varchar(2000);
  DECLARE @v_tab_comments varchar(2000);
  DECLARE @v_column_name varchar(2000);
  DECLARE @v_data_type varchar(2000);
  DECLARE @v_col_comments varchar(2000);
	declare @temp varchar(50)
BEGIN
print @p_table_name;
BEGIN TRY
 --print '12345';
	set @p_error_no   = 0;
  set @p_error_info = '';
  set @nb_begindate = CONVERT(varchar,GETDATE(),120) ;

  set @v_out_sql= 'use 数据库名;'+CHAR(10) +'drop table '+@p_table_name+';'+CHAR(10) +'create table '+@p_table_name+'('+CHAR(10);

  EXEC('truncate table t_p_table_name_temp')
-- print '13';
 insert into t_p_table_name_temp
(table_name, column_name, data_type)
select table_name,column_name,data_type
from information_schema.columns
where 
table_name= @p_table_name
--table_name= 'ADDRESSBOOK'
ORDER BY ORDINAL_POSITION;

-- print @p_table_name;
 

   update t_p_table_name_temp set data_type = 'string' where data_type = 'nvarchar';
	 update t_p_table_name_temp set data_type = 'string' where data_type = 'char';
	 update t_p_table_name_temp set data_type = 'string' where data_type = 'text';
   update t_p_table_name_temp set data_type = 'double' where data_type = 'float';
	 update t_p_table_name_temp set data_type = 'boolean' where data_type = 'bit';
	 update t_p_table_name_temp set data_type = 'string' where data_type = 'datetime';
	 update t_p_table_name_temp set data_type = 'string' where data_type = 'numeric';


 --print @p_table_name;
   --dbms_output.put_line(v_update_sql);

DECLARE c_row cursor for (SELECT column_name FROM t_p_table_name_temp)
  -- for c_row in (SELECt * FROM t_p_table_name_temp)
--   loop
open c_row
 fetch next from c_row into @temp
 while @@FETCH_STATUS = 0
 begin
      --@v_owner = c_row.owner;
     set @v_table_name = @p_table_name;
	--	print  @v_table_name
     -- @v_tab_comments = c_row.tab_comments;
     set @v_column_name = @temp;
     set @v_data_type = (select data_type from t_p_table_name_temp where column_name=@temp);
    --  @v_col_comments = c_row.col_comments;

      if (@v_temp_sql is null) 
			begin
        set @v_temp_sql = @v_column_name +' '+@v_data_type;
         set @v_detail_sql = @v_column_name;
				 end
				 
      else
			begin
        set @v_temp_sql = @v_temp_sql +','+CHAR(10) + @v_column_name +' '+@v_data_type;
        set @v_detail_sql = @v_detail_sql+',' + CHAR(10)+ @v_column_name;
				 end
fetch next from c_row into @temp
 -- end loop;
end
close c_row
DEALLOCATE  c_row
  set @v_out_sql = @v_out_sql + @v_temp_sql +') '+CHAR(10);
  set @v_detail_sql = 'select ' + CHAR(10)+ @v_detail_sql + ' from '+@v_table_name;
  set @v_out_sql=@v_out_sql+'ROW FORMAT DELIMITED FIELDS TERMINATED BY '',''
STORED AS ORC ;';

 --print @p_table_name;

  set @nb_enddate = CONVERT(varchar,GETDATE(),120) ;

  delete t_sql where table_name = @p_table_name;
  insert into t_sql
    (scsj, sqlyj, table_name, mxyj)
  values
    (@nb_enddate, @v_out_sql, @p_table_name, @v_detail_sql);


 set @p_error_no   = 1;
 set @p_error_info = '调度平台建表语句生成成功!';
 
END TRY
     BEGIN CATCH
  set  @p_error_no   = -1;
  set  @p_error_info = '调度平台建表语句生成失败!' ;

		END CATCH
END
4.执行存储过程,生成建表语句
exec 数据库名.P_DDPT_SQL_INIT @p_table_name='edoc_body',@p_error_no=0,@p_error_info='';
exec 数据库名.P_DDPT_SQL_INIT @p_table_name='formson_0152',@p_error_no=0,@p_error_info='';
exec 数据库名.P_DDPT_SQL_INIT @p_table_name='CTP_ENUM_CN',@p_error_no=0,@p_error_info='';
exec 数据库名.P_DDPT_SQL_INIT @p_table_name='表名',@p_error_no=0,@p_error_info='';

表名可通过以下sql语句查询:

select table_name 

from information_schema.tables 

where table_schema='数据库名'

注意T_SQL和T_P_TABLE_NAME_TEMP是多余的表明,记得删除

5.生成的建表语句在T_SQL表中,示例如下:

6.删除T_SQL和T_P_TABLE_NAME_TEMP
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/423375.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号