sqlserver数据导入mysql二: 根据sqlserver表结构创建mysql表的perl代码
2014-03-07 17:30
856 查看
思路是 读取sqlserver的表名和字段 类型
因为sqlserver和mysql中类型不同 把类型做相应的变化
后 拼接建表sql语句 在mysql中运行
代码如下:
因为sqlserver和mysql中类型不同 把类型做相应的变化
后 拼接建表sql语句 在mysql中运行
代码如下:
#!/usr/bin/perl use DBI; use Switch; use Encode; use Encode::CN; my $source_name = "mysqldata"; my $source_user_name = "sa"; my $source_user_psd = "123"; my $db_name="sqldata"; my $location="192.168.0.208"; my $port="3306"; my $db_user="sa"; my $db_pass="123"; my $dbh=DBI->connect("dbi:ODBC:$source_name",$source_user_name,$source_user_psd); #获取所有的用户表 my $sth=$dbh->prepare("select name,object_id from sys.all_objects where type='U' and is_ms_shipped=0 and name <>'sysdiagrams'"); $sth->execute(); my $n=0; while (@data=$sth->fetchrow_array()) { #print $data[0].$data[1]; $n+=1; #获取列 get_columns($data[0],$data[1]); open(FILE,">>createtableallname.txt"); syswrite(FILE,"$n\n"); syswrite(FILE,"$data[0]\n"); close(FILE); } $sth->finish; $dbh ->disconnect; ##获取所有的列 sub get_columns { $dbh2=DBI->connect("dbi:ODBC:$source_name",$source_user_name,$source_user_psd); my $sql="select col.name,tp.name,col.max_length,col.[precision],col.[scale],col.[is_nullable],col.[is_identity] from sys.all_columns col inner join sys.types tp on col.system_type_id=tp.system_type_id and col.user_type_id=tp.user_type_id where object_id=$_[1]"; my $cols=$dbh2 -> prepare($sql); $cols->execute(); my $cols_str = ""; my $n=0; my $varlen=2000; while(@col= $cols->fetchrow_array()) { ($col_name,$type_name,$max_length,$precision,$scale,$is_nullable,$is_identity)=@col; switch ( $type_name) { case "nchar" { $type_name="char"; } case "bit" { $type_name="boolean"; } case "ntext" { $type_name="text"; } case "nvarchar" { $type_name="varchar"; } case "datetime2" { $type_name="date";} case "money" { $type_name="decimal";} else { $type_name=$type_name;} } if($type_name eq "varchar") { $n++; } if($n==0) {$n=1} $varlen=21000/$n; } my $cols2=$dbh2 -> prepare($sql); $cols2->execute(); while(@col= $cols2->fetchrow_array()) { ($col_name,$type_name,$max_length,$precision,$scale,$is_nullable,$is_identity)=@col; switch ( $type_name) { case "nchar" { $type_name="char"; } case "bit" { $type_name="boolean"; } case "ntext" { $type_name="text"; } case "nvarchar" { $type_name="varchar"; } case "datetime2" { $type_name="date";} case "money" { $type_name="decimal";} else { $type_name=$type_name;} } if($cols_str ne "") { $cols_str = "$cols_str, \n"; } if($type_name eq "hierarchyid") { if($cols_str eq "") { # $cols_str = "$cols_str `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,`parent_id` INT"; $cols_str = "$cols_str `$col_name` varchar(31)"; } else { $cols_str = "$cols_str `$col_name`varchar(31)"; } } else { $cols_str = "$cols_str `$col_name` $type_name"; switch($type_name) { case "varchar" { if($max_length == -1) { $cols_str = "$cols_str($varlen)"; } else { #$cols_str = "$cols_str(985)"; $cols_str = "$cols_str($max_length)"; } } case "numeric" { $cols_str = "$cols_str($precision,$scale)"; } case "char" { if($max_length == -1) { $cols_str = "$cols_str($varlen)"; } else { #$cols_str = "$cols_str(985)"; $cols_str = "$cols_str($max_length)"; } } } if($is_nullable == 0) { $cols_str="$cols_str NOT NULL "; } if($is_identity == 1) { $cols_str="$cols_str AUTO_INCREMENT PRIMARY KEY"; } } } #print "create table IF NOT EXISTS `$_[0]`($cols_str);"; exec_mysql( "create table IF NOT EXISTS `$_[0]`($cols_str);"); $cols->finish; $cols2->finish; $dbh2 ->disconnect; } sub exec_mysql { my $data_base = "DBI:mysql:$db_name:$location:$port"; my $dbh3=DBI -> connect($data_base,$db_user,$db_pass); $dbh3->do("SET character_set_client = 'utf8'"); $dbh3->do("SET character_set_connection = 'utf8'"); # my $data_str=encode("utf-8",decode("gbk",$_[0])); my $data_str=$_[0]; my $sth=$dbh3->prepare($data_str); #open(FILE,">>createtableallname.txt"); #syswrite(FILE,"$data_str"); #close(FILE); $sth->execute() or die "$data_str----ERROR::$data_str::$dbh3->errstr"; $dbh3->disconnect; print 'ok'; }
相关文章推荐
- sqlserver数据导入mysql二: 根据sqlserver表结构创建mysql表的perl代码
- HIVE的安装配置、mysql的安装、hive创建表、创建分区、修改表等内容、hive beeline使用、HIVE的四种数据导入方式、使用Java代码执行hive的sql命令
- 将mysql数据导入到MS Sql Server中
- sqlserver数据导入mysql一: 创建mysql数据库 perl脚本
- sql文件导入大批量数据时,报错:Lost connection to MySQL server during query
- sqlserver数据导入mysql一: 创建mysql数据库 perl脚本
- (转载)根据数据字典表定义的表结构,生成创建表的SQL语句
- mysql导入导出表结构及表数据及执行sql文件
- mysql导入导出表结构及表数据及执行sql常用指令
- SQLServerToSQLite 程序代码的分析翻译及学习(二、根据数据库描述对象创建SQLite数据库)
- 将mysql数据导入到MS Sql Server中
- mysql运行转储的sql文件导入大批量数据时,报错:Lost connection to MySQL server during query
- sql Server 批量插入以及sql Server数据导入到mysql sqlServer数据每10000条导出一个文件
- kettle 增量数据之sqlserver 转mysql 空值导入失败
- MySQL server has gone away,Mysql导入大容量SQL文件数据问题
- mysql导入导出表结构及表数据及执行sql文件
- MySQL(Navicat)运行.sql文件时报错:[Err] 2006 - MySQL server has gone away 的解决方法 背景: 今天导入一个数据量很大的.sql文件时,
- mysql导入导出数据中文乱码解决方法小结(1、navicat导入问题已解决,创建连接后修改连接属性,选择高级->将使用Mysql字符集复选框去掉,下拉框选择GBK->导入sql文件OK;2、phpmyadmin显示乱码的问题也解决,两步:1.将sql文件以utf8的字符集编码另存,2.将文件中sql语句中的字段字符集编码改成utf8,导入OK)
- 将mysql数据导入到MS Sql Server中