用程序实现SQL的表导出

公司里面对公用数据库的访问有很多限制,因为涉及到性能问题。一般程序用到的就只有几张表。为了更自由地访问数据,一般都需要作数据导出。

用程序实现数据导出,有以下几个问题:

1 数据丢失

用程序导数据,特别是增量导数据,是容易丢失数据的。我的处理方法是利用数据库表的AddTime字段。每次增量导入时,从dest表中取得最大时间,如果不存在(空表),则指定人工指定一个时间点。导入的时间要比最大时间小几秒钟,我定义的是5秒。

2 数据插入冲突

数据插入冲突也是比较容易出现的问题,解决方法是Insert If Not Exist。 对应到sql语句是:

insert into table_name (id,name) select 2,‘a‘ where not exists (select 1 from table_name where id = 2)

3 导入数据的性能

为了提高性能,最好用增量的方式。Java代码如下:

while(rs.next()){
   ++queryCount;
   for(int i=1;i<=count;i++){
    destPs.setObject(i, rs.getObject(i));
   }
   destPs.setObject(count+1, rs.getObject(pk));
   destPs.addBatch();
   if(batchSize%100==0){
      destPs.executeBatch();
   }
}
destPs.executeBatch();

4、程序的通用性

一般导数据的逻辑都是一样的,只是表不一样而已。这样的话,在程序实现的时,通用性就显得很重要,不然冗余代码会很多,程序也不好维护。一般的作法是把sql语句抽象出来。Insert语句由表结构生成。生成的Insert语句代码如下:

/*
 * 生成插入语句
 * @param tag 对于设置了主键自动增长的表,需要
 * set identity_insert "+tableName+" ON
 * */
public String sqlGenerate(int count,ResultSetMetaData rsd,String tableName,String pk,boolean tag) throws SQLException{
    String sql="";
    if(tag){
        sql="set identity_insert "+tableName+" ON;";
    }
    sql+=" insert into "+tableName;
    //columns
    sql+="("+rsd.getColumnName(1);
    for(int i=2;i<=count;i++){
        sql+=‘,‘;
        sql+=rsd.getColumnName(i);
    }
    sql+=")";
    //values
    sql+="select ?";
    for(int i=2;i<=count;i++){
        sql+=",?";
    }
    sql+=" where not exists (select 1 from "+tableName+" where "+pk+" = ? )";
    return sql;
}

这样的话,整个程序就变得很简洁。其实第四点是根据第二点的结构生成的。

用程序实现SQL的表导出

时间: 2024-10-21 06:21:20

用程序实现SQL的表导出的相关文章

[转载]在SQL Server 中,如何实现DBF文件和SQL Server表之间的导入或者导出?

原来使用SQL Server 2000数据库,通过DTS工具很方便地在SQL Server和DBF文件之间进行数据的导入和导出,现在安装了SQL Server2005之后,发现其提供的“SQL Server导入导出向导”中的数据源没有原来的丰富,缺少对DBF文件的支持. 1.右击数据库,选择“任务”>“导入数据”,打开“SQL Server导入和导出向导”对话框.2.在“数据源”中选择Microsoft OLE DB Provider for Visual FoxPro,单击“属性”按钮,打开“

导出 SQL SERVER 表中数据为脚本

ALTER PROCEDURE [dbo].[Usp_OutputData] @tablename sysname, @outputIdentitycolumn int AS declare @column varchar(3000) declare @columndata varchar(8000) declare @sql varchar(8000) declare @xtype tinyint declare @name sysname declare @objectId int decl

SQL Server里面导出SQL脚本(表数据的insert语句)

转载自:http://hi.baidu.com/pigarmy/blog/item/109894c445eab0a28326ac5a.html 最近需要导出一个表的数据并生成insert语句,发现SQL Server的自带工具并米有此功能.BAIDU一下得到如下方法(亲测OK) 用这个存储过程可以实现: CREATE PROCEDURE dbo.UspOutputData @tablename sysname AS declare @column varchar(1000) declare @c

常见SQL Server导入导出数据的几个工具

摘自:http://www.cnblogs.com/chenxizhang/archive/2011/06/09/2076542.html 在我们的日常工作中,与数据库打交道的机会越来越多.这一篇文章我整理一下常见的SQL Server导入导出数据的几个工具 1. 数据导入导出向导 这是一个可视化的工具,我放在首位,是由于它可以极大灵活地满足导入导出功能,而且是所见即所得的,易于使用. 启动数据导入导出向导的方式有好多种,我自己习惯直接通过如下的命令启动(开始=>运行) dtswizard(顾名

Shell脚本实现DB2数据库表导出到文件

该Shell脚本用于实现将DB2数据库表导出到文件,将在另一篇博文<Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件>中通过Java代码实现调用该脚本并传入参数. 1 #!/usr/bin/env sh 2 3 DBSCHEMA=$1 4 DBUSER=$2 5 DBPASSWORD=$3 6 TABLENAME=$4 7 FILEPATH=$5 8 DELIMITER=$6 9 EXPORTLIMIT=$7 10 11 SQLERR="NO ERROR MSG&

sql server 数据库导出表里所有数据成insert 语句

有时候,我们想把数据库的某张表里的所有数据导入到另外一个数据库或另外一台计算机上的数据库,对于sql server有这样的一种方法 下面我以sql server 2008 R2,数据库是Northwind数据库为例, 目标:把Northwind数据库的Orders表导出成insert语句. 第一步:选择Northwind数据库,右键-任务-生成脚本: 第二步:在弹出的“生成和发布脚本”的简介窗口,按“下一步”按钮: 第三步:在“选择对象”窗口,选中“选择特定数据库对象”,展开表, 勾选要生成in

考试系统维护--不同版本SQL数据导入导出

考试系统维护过程中,为了保证考试的顺利进行需要在多个服务器上搭建考试系统(备份),这时候需要把数据库来回迁移,之前我们常用的数据库备份还原的方法确实简单方便,但是遇到不同的服务器安装的SQL版本不同就歇菜了,虽然当时为了以后操作方便,我们把这次要用的服务器的数据库版本都统一了,但是在考试系统维护中米老师让我感触最深的一点-----"凡事多想一点!"多思考必须要应用到实际,所以我回来又仔细研究了几种不同版本SQL数据导入导出的方法,与大家交流提高. 一:使用SQLServer Impor

PL/SQL Developer导入导出Oracle数据库方法

前一篇博客介绍了Navicat工具备份Oracle的方法,这篇博客介绍一下使用PL/SQL Developer工具导入导出Oracle数据库的方法. PL/SQL Developer是Oracle数据库用于导入导出数据库的主要工具之一,本文主要介绍利用PL/SQL导入导出Oracle数据库的过程. 1.Oracle数据库导出步骤 1.1 Tools→Export User Objects...选项,导出.sql文件. 说明:此步骤导出的是建表语句(包括存储结构). 1.2 Tools→Expor

c#自带压缩类实现数据库表导出到CSV压缩文件的方法

原文:c#自带压缩类实现数据库表导出到CSV压缩文件的方法 在导出大量CSV数据的时候,常常体积较大,采用C#自带的压缩类,可以方便的实现该功能,并且压缩比例很高,该方法在我的开源工具DataPie中已经经过实践检验.我的上一篇博客<功能齐全.效率一流的免费开源数据库导入导出工具(c#开发,支持SQL server.SQLite.ACCESS三种数据库),每月借此处理数据5G以上>中有该工具的完整源码,有需要的同学可以看看. 在.net 4.5中,可以轻松创建zip文件 ,首先需要引入 Sys