Chinaunix

标题: 怎样将表中数据导出,形成insert into 表名 values(...)这样的语句? [打印本页]

作者: leeyongwu    时间: 2003-12-17 13:58
标题: 怎样将表中数据导出,形成insert into 表名 values(...)这样的语句?
我有个小软件,要在客户那里安装SQL server2000和我的vb写的软件,但想给对方哪里减轻麻烦,想将那些数据形成insert into 表名 values(...)那样的脚本文件,在软件安装时自动插入就可以了。

请问:怎样将表中数据导出,形成insert into 表名 values(...)这样的语句?
作者: ccwlm741212    时间: 2003-12-17 14:28
最初由 qzhx 发布
[B]sql server 好像没这个功能,用这个工具试试! [/B]


好东西,加精华,谢谢
作者: leeyongwu    时间: 2003-12-17 16:38
谢谢qzhx大侠!
真是神人!
作者: 花好月不圆    时间: 2003-12-17 16:46
呵呵 对 sybase  数据库不能用,有个 bug 呀:iproud:
作者: wangyuzhen    时间: 2003-12-17 19:17
刚用过,实在厉害,
但在我这里不能访问oracle8i
作者: ccwlm741212    时间: 2003-12-17 20:28
这是MS SQL板快啊,否则嘿嘿:p
作者: magicangel    时间: 2003-12-18 02:33
不错,谢谢。

不过对于二进制大对象数据还是没有处理好。
作者: chris_cj    时间: 2003-12-26 13:58
你们有没有注册吗呀?能否告知,多谢啦!!!
作者: hexiaoyang    时间: 2003-12-28 11:48
最初由 chris_cj 发布
[B]你们有没有注册吗呀?能否告知,多谢啦!!! [/B]



不需要注册的
我已经推荐给120人左右使用了!!:rose: :right:
作者: chris_cj    时间: 2003-12-30 15:13
为什么我新建了连接后,点击显示所有表总是报“数据库连接失败”,我急着要用,多谢赐教!
我Test connection是成功的。
作者: Arrayzzychb    时间: 2003-12-31 14:37
要是能把查询出来的数据另存为EXCEL档就更好了
作者: Sailor    时间: 2004-01-08 08:56
最初由 zzychb 发布
[B]要是能把查询出来的数据另存为EXCEL档就更好了 [/B]


   不大好,一個Excel表最多能存65536行,分幾個Excel表又不方便,
數據多的表個如何辦?
作者: Sailor    时间: 2004-01-08 08:58
最初由 qzhx 发布
[B]sql server 好像没这个功能,用这个工具试试! [/B]


有沒繁體或英文版?
作者: guchongming    时间: 2004-01-08 12:10
标题: oracle数据库有个小工具--toad可以对oracle进行导入导出
呵呵,我来补充一下,oracle里面有个toad软件
1.可以对oracle进行导入导出
2.可以实现oracle客户端所有的功能
3.包括写plsql(procedure);
4.实现sqlplus功能
作者: lynx286    时间: 2004-01-13 16:02
http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=181964
作者: stormproof    时间: 2004-04-18 11:16
好东西!
如果我的字段类型为 nVarchar 时,生成的语句有问题,汉字前要加 \'N\'  的。
能否共享出源代码?
作者: xzh2000    时间: 2004-09-23 14:27
最初由 wangyuzhen 发布
[B]刚用过,实在厉害,
但在我这里不能访问oracle8i [/B]


14:11:52 SQL> exec print_insert(\'province\');
*** xzxh2000向你问好! ***
insert into province values(1,1,\'BJ\',\'北京\',\'BJ\',\'BJ\',1,\'暂无\');
insert into province values(4,1,\'CQ\',\'重庆\',\'CQ\',\'CQ\',22,\'暂无\');
insert into province values(27,1,\'FJ\',\'福建\',\'FJ\',\'FJ\',261,\'暂无\');
insert into province values(9,1,\'GD\',\'广东\',\'GD\',\'GD\',39,\'暂无\');
insert into province values(33,1,\'GS\',\'甘肃\',\'GS\',\'GS\',337,\'暂无\');
insert into province values(26,1,\'GX\',\'广西\',\'GX\',\'GX\',247,\'暂无\');
insert into province values(20,1,\'GZ\',\'贵州\',\'GZ\',\'GZ\',183,\'暂无\');
insert into province values(25,1,\'HAIN\',\'海南\',\'HAIN\',\'HAIN\',239,\'暂无\');
insert into province values(11,1,\'HB\',\'湖北\',\'HB\',\'HB\',75,\'暂无\');
insert into province values(18,1,\'HEB\',\'河北\',\'HEB\',\'HEB\',168,\'暂无\');
insert into province values(14,1,\'HEN\',\'河南\',\'HEN\',\'HEN\',111,\'暂无\');
insert into province values(29,1,\'HLJ\',\'黑龙江\',\'HLJ\',\'HLJ\',284,\'暂无\');
insert into province values(21,1,\'HN\',\'湖南\',\'HN\',\'HN\',192,\'暂无\');
insert into province values(5,1,\'HK\',\'香港特别行政区\',\'HK\',\'HK\',23,\'暂无\');
insert into province values(16,1,\'JL\',\'吉林\',\'JL\',\'JL\',145,\'暂无\');
insert into province values(8,1,\'JS\',\'江苏\',\'JS\',\'JS\',26,\'暂无\');
insert into province values(10,1,\'JX\',\'江西\',\'JX\',\'JX\',65,\'暂无\');
insert into province values(28,1,\'LN\',\'辽宁\',\'LN\',\'LN\',270,\'暂无\');
insert into province values(32,1,\'NMG\',\'内蒙古\',\'NMG\',\'NMG\',321,\'暂无\');
insert into province values(22,1,\'NX\',\'宁夏\',\'NX\',\'NX\',205,\'暂无\');
insert into province values(6,1,\'MACAO\',\'澳门特别行政区\',\'MACAO\',\'MACAO\',24,\'暂无\');
insert into province values(31,1,\'QH\',\'青海\',\'QH\',\'QH\',313,\'暂无\');
insert into province values(23,1,\'SC\',\'四川\',\'SC\',\'SC\',209,\'暂无\');
insert into province values(13,1,\'SD\',\'山东\',\'SD\',\'SD\',103,\'暂无\');
insert into province values(2,1,\'SH\',\'上海\',\'SH\',\'SH\',6,\'暂无\');
insert into province values(24,1,\'SHX\',\'陕西\',\'SHX\',\'SHX\',230,\'暂无\');
insert into province values(12,1,\'SX\',\'山西\',\'SX\',\'SX\',88,\'暂无\');
insert into province values(3,1,\'TJ\',\'天津\',\'TJ\',\'TJ\',21,\'暂无\');
insert into province values(30,1,\'XJ\',\'新疆\',\'XJ\',\'XJ\',297,\'暂无\');
insert into province values(19,1,\'XZ\',\'西藏\',\'XZ\',\'XZ\',176,\'暂无\');
insert into province values(15,1,\'YN\',\'云南\',\'YN\',\'YN\',129,\'暂无\');
insert into province values(17,1,\'ZJ\',\'浙江\',\'ZJ\',\'ZJ\',154,\'暂无\');
insert into province values(35,1,\'QT\',\'其他\',\'QT\',\'QT\',362,\'暂无\');
insert into province values(34,1,\'AH\',\'安徽\',\'AH\',\'AH\',351,\'暂无\');
insert into province values(7,1,\'TW\',\'台湾\',\'TW\',\'TW\',25,\'暂无\');
insert into province values(0,1,\'QG\',\'全国\',\'country\',\'country\',0,\'暂无\');
insert into province values(36,1,\'XJP\',\'新加坡\',\'XJP\',\'XJP\',561,\'0\');

PL/SQL procedure successfully completed.

print_insert()过程在偶的blog里面有记载.
作者: magicangel    时间: 2004-09-23 14:48
http://www.itpub.net/showthread. ... 223&pagenumber=
作者: xzh2000    时间: 2004-09-23 15:14
最初由 magicangel 发布
[B]谢兄贴出来啊。 [/B]


我这个只适合oracle用,而且也不支持lob字段。

create or replace procedure print_insert(v_tname varchar2,v_cbatch number default 0)
/*
        v_tname  要输出sql的表名        作者zh2000@hotmail.com
        v_cbatch 输出commit间隔                博客:http://blog.itpub.net/xzh2000
*/
as
/* 声明动态游标变量 */
        type cur_alldata is ref cursor;
  l_alldata cur_alldata;
/* 将单行数据写入v_row*/
  v_sql varchar2(3999);
        v_row varchar2(3999);
/* 函数的前向声明 */
  function formatfield(v_tname varchar2,v_cname varchar2,v_colno number) return varchar2;
/* 格式化数据输出 */       
        function formatdata(v_tname varchar2,v_row varchar2) return varchar2
        as
                v_ldata varchar2(32765);
                v_rdata varchar2(32765);
                v_cname varchar2(3999);
                v_instr number(;
                v_count number(6);
        begin
                v_instr := instr(v_row,\'(\');
                v_ldata := substr(v_row,1,v_instr);
                v_rdata := substr(v_row,v_instr+1);
                v_instr := instr(v_rdata,\')\');
                v_rdata := substr(v_rdata,1,v_instr-1);

                v_count := 0;
                loop
                        v_instr := instr(v_rdata,\',\');
                        v_count := v_count + 1;

                        exit when v_instr = 0;

                        v_cname := substr(v_rdata,1,v_instr-1);
                        v_rdata := substr(v_rdata,v_instr+1);
      
                        /* 格式化不同的数据类型 */
                        v_cname := formatfield(v_tname,v_cname,v_count);

                        /* 将处理后的字段值加入v_ldata */
                        if v_count = 1 then
                                 v_ldata := v_ldata||v_cname;
                        else
                                 v_ldata := v_ldata||\',\'||v_cname;
                        end if;

                end loop;

                /* 添加最后一个字段的值 */
                if v_count = 1 then
                         v_ldata := v_ldata||formatfield(v_tname,v_rdata,v_count)||\');\';
                else
                         v_ldata := v_ldata||\',\'||formatfield(v_tname,v_rdata,v_count)||\');\';
                end if;
                return v_ldata;
        end;
/* 针对不同的数据类型进行处理 */
  function formatfield(v_tname varchar2,v_cname varchar2,v_colno number) return varchar2       
        as
                v_name varchar2(3999);
          v_type varchar2(99);
  begin
                select coltype into v_type from col where tname = upper(v_tname) and colno = v_colno;
                if v_type = \'DATE\' then
                        v_name := \'to_date(\'||\'\'\'\'||v_cname||\'\'\'\'||\',\'||\'\'\'\'||\'yyyy-mm-dd hh24:mi:ss\'||\'\'\'\'||\')\';
                elsif v_type = \'VARCHAR2\' then
                        v_name := \'\'\'\'||v_cname||\'\'\'\';
                else
                        v_name := v_cname;
                end if;
                return v_name;
        end;
/* 求输入表的字段列表 */
        function getfields(v_tname varchar2) return varchar2
        as
         v_fields varchar2(3999);
        begin
         for cur_fname in (select cname,coltype from col where tname = upper(v_tname) order by colno) loop
                 if v_fields is null then
                         v_fields := \'nvl(\'||cur_fname.cname||\',\'||\'\'\'\'||\'0\'||\'\'\'\'||\')\';
                 else
                         v_fields := v_fields||\'||\'\',\'\'||\'||\'nvl(\'||cur_fname.cname||\',\'||\'\'\'\'||\'0\'||\'\'\'\'||\')\';
                 end if;         
         end loop;
         v_fields := \'select \'||\'\'\'\'||\'insert into \'||v_tname||\' values(\'||\'\'\'\'||\'||\'||v_fields||\'||\'||\'\'\'\'||\')\'||\'\'\'\'||\' from \'||v_tname;
         return v_fields;
        end;
begin
        execute immediate \'alter session set nls_date_format=\'||\'\'\'\'||\'yyyy-mm-dd hh24:mi:ss\'||\'\'\'\';
  dbms_output.put_line(\'  *** xzxh2000向你问好! ***  \');

        v_sql := getfields(v_tname);
        --dbms_output.put_line(v_sql);
        open l_alldata for v_sql;
  
        loop
   fetch l_alldata into v_row;
         exit when l_alldata%notfound;
         --dbms_output.put_line(v_row);

   dbms_output.put_line(formatdata(v_tname,v_row));
         if mod(l_alldata%rowcount,v_cbatch) = 0 then
                 dbms_output.put_line(\'commit;\');
         end if;
        end loop;

  close l_alldata;
end;

create or replace function sum_string(v_sql varchar2)
return varchar2
/*
                 作者zh2000@hotmail.com
                博客:http://blog.itpub.net/xzh2000
*/
as
/* 声明动态游标变量 */
        type cur_alldata is ref cursor;
  l_alldata cur_alldata;
/* 查询sql及其变量 */
        v_row varchar2(99);
  v_sum varchar2(3999);
begin
  open l_alldata for v_sql;
  loop
                fetch l_alldata into v_row;
                /* 没有数据却退出 */
                exit when l_alldata%notfound;
   
                v_sum := v_sum||\',\'||v_row;
        end loop;

  v_sum := substr(v_sum,2);
  close l_alldata;

        return v_sum;
end;
作者: esunshine    时间: 2004-10-23 12:13
强啊。支持。谢谢分享
作者: esunshine    时间: 2004-10-23 12:22
在SQL SERVER 2000里。还原到数据库里的不能连接上。不知道为什么?谢谢。
作者: loveplay    时间: 2005-01-16 15:36
标题:  可用PB简单实现
在pb的数据库界面实现
作者: SZAMT    时间: 2005-01-16 23:00
我只能说谢谢了,好人啊,好人一生幸福!
作者: guomulin    时间: 2005-07-06 17:43
文件下载下来打不开,已损坏,谁有能不能发到我的邮箱里谢谢了。guomulin@sina.com.cn
作者: 招手的雪人    时间: 2005-07-07 11:53
标题: 学习
好佩服楼主哦,学习中...
作者: risepp    时间: 2006-08-08 21:14
谢谢,正好用上   呵呵
作者: 斯年    时间: 2006-08-09 12:41
没法下载了,
作者: dorislh    时间: 2006-10-12 15:04
一直在寻找中,谢谢!
作者: llcheng    时间: 2007-08-28 16:00
这个软件太爽了,对Delphi支持特别好哈
作者: xiaodong_1567    时间: 2007-10-20 20:34
不错的工具
谢谢分享!!!
作者: ord_bo    时间: 2008-01-23 19:58
不错,最近正好有个应用,下了试试,谢谢。
作者: ord_bo    时间: 2008-01-23 20:47
好像不能把查询后的结果数据形成Insert语句啊...能的话就更好了!

[ 本帖最后由 ord_bo 于 2008-1-24 21:54 编辑 ]
作者: zhongjfcn    时间: 2008-01-24 22:06
才知道原来pb还有这个功能呀
作者: zefuzhang    时间: 2008-02-13 10:25
USE [master]
GO
/****** 对象:  StoredProcedure [dbo].[sp_generate_insert_script]    脚本日期: 02/04/2008 09:28:09 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_generate_insert_script]
                 @tablename_mask varchar(30) = NULL
AS
BEGIN

  DECLARE @tablename       varchar (128)
  DECLARE @tablename_max   varchar (128)
  DECLARE @tableid         int
  DECLARE @columncount     numeric (7,0)
  DECLARE @columncount_max numeric (7,0)
  DECLARE @columnname      varchar (30)
  DECLARE @columntype      int
  DECLARE @string          varchar (30)
  DECLARE @leftpart        varchar (max)  
  DECLARE @rightpart       varchar (max)
  DECLARE @hasident        int
  SET NOCOUNT ON
  IF (@tablename_mask IS NULL)
  BEGIN
    SELECT @tablename_mask = \'%\'
  END
  
  CREATE TABLE #columninfo
  (num      numeric (7,0) identity,
   name     varchar(30),
   usertype smallint)

  SELECT name,
         id
  INTO #tablenames
  FROM sysobjects
  WHERE type IN (\'U\' ,\'S\')
     AND name LIKE @tablename_mask

  SELECT @tablename_max  = MAX (name),
         @tablename      = MIN (name)
  FROM #tablenames

  WHILE @tablename <= @tablename_max
  BEGIN
    SELECT @tableid   = id
    FROM #tablenames
    WHERE name = @tablename

    IF (@@ROWCOUNT <> 0)
    BEGIN
      SELECT @hasident = max( status & 0x80 )
      FROM syscolumns
      WHERE id = @tableid

      TRUNCATE TABLE #columninfo
      INSERT INTO #columninfo (name,usertype)
      SELECT name, type
      FROM syscolumns C
      WHERE id = @tableid
         AND type <> 37            -- do not include timestamps

      SELECT @leftpart = \'SELECT \'\'INSERT INTO \'+@tablename

      SELECT @leftpart = @leftpart + \'(\'

      SELECT @columncount     = MIN (num),
             @columncount_max = MAX (num)
      FROM #columninfo

      WHILE @columncount <= @columncount_max
      BEGIN
        SELECT @columnname = name,
               @columntype = usertype
        FROM #columninfo
        WHERE num = @columncount

        IF (@@ROWCOUNT <> 0)
        BEGIN
          IF (@columncount < @columncount_max)
          BEGIN
            SELECT @leftpart = @leftpart + @columnname + \',\'
          END
          ELSE
          BEGIN
            SELECT @leftpart = @leftpart + @columnname + \')\'
          END
        END
        SELECT @columncount = @columncount + 1
      END

      SELECT @leftpart = @leftpart + \' values(\'\'\'

      SELECT @columncount     = MIN (num),
             @columncount_max = MAX (num)
      FROM #columninfo

      SELECT @rightpart = \'\'

      WHILE @columncount <= @columncount_max
      BEGIN
        SELECT @columnname = name,
               @columntype = usertype
        FROM #columninfo
        WHERE num = @columncount

        IF (@@ROWCOUNT <> 0)
        BEGIN
          IF @columntype IN (39,47) /* char fields need quotes (except when entering NULL);
                                    *  use char(39) == \', easier readable than escaping
                                    */
          BEGIN
            SELECT @rightpart = @rightpart + \'+\'
            SELECT @rightpart = @rightpart + \'ISNULL(\' + replicate( char(39), 4 ) + \'+REPLACE(\' + @columnname + \',\' + replicate( char(39), 4 ) + \',\' + replicate( char(39), 6) + \')+\' + replicate( char(39), 4 ) + \',\'\'NULL\'\')\'
          END
          ELSE IF @columntype = 35 /* TEXT fields cannot be RTRIM-ed and need quotes     */
                                   /* convert to VC 1000 to leave space for other fields */
          BEGIN
            SELECT @rightpart = @rightpart + \'+\'
            SELECT @rightpart = @rightpart + \'ISNULL(\' + replicate( char(39), 4 ) + \'+REPLACE(CONVERT(varchar(1000),\' + @columnname + \')\' + \',\' + replicate( char(39), 4 ) + \',\' + replicate( char(39), 6 ) + \')+\' + replicate( char(39), 4 ) + \',\'\'NULL\'\')\'
          END
          ELSE IF @columntype in (58,61,111) /* datetime fields */
          BEGIN
            SELECT @rightpart = @rightpart + \'+\'
            SELECT @rightpart = @rightpart + \'ISNULL(\' + replicate( char(39), 4 ) + \'+CONVERT(varchar(20),\' + @columnname + \')+\'+ replicate( char(39), 4 ) + \',\'\'NULL\'\')\'
          END
          ELSE   /* numeric types */
          BEGIN
            SELECT @rightpart = @rightpart + \'+\'
            SELECT @rightpart = @rightpart + \'ISNULL(CONVERT(varchar(99),\' + @columnname + \'),\'\'NULL\'\')\'
          END

          IF ( @columncount < @columncount_max)
          BEGIN
            SELECT @rightpart = @rightpart + \'+\'\',\'\'\'
          END
        END
        SELECT @columncount = @columncount + 1
      END
    END
    SELECT @rightpart = @rightpart + \'+\'\')\'\'\' + \' FROM \' + @tablename
     
    SELECT @rightpart = @rightpart + \' ORDER BY 1\'
     
    IF @hasident > 0
       SELECT \'SET IDENTITY_INSERT \' + @tablename + \' ON\'
    EXEC ( @leftpart + @rightpart )
    IF @hasident > 0
       SELECT \'SET IDENTITY_INSERT \' + @tablename + \' OFF\'
    SELECT @tablename= MIN (name)
    FROM #tablenames
    WHERE name> @tablename
  END
END
----再选择要导出语句的数据库,在“查询”中选择“结果保存为文件……”,
--执行EXEC sp_generate_insert_script \'表名\',如果不写表名,
--将导出数据库中所有的表的内容。保存的文件即为Insert的SQL语句。
作者: yueliangdao0608    时间: 2008-02-13 14:49
我记得邹建老大写了一个存储过程专门做这个事的。可以去他的BLOG上看看。
作者: yuanfang2008    时间: 2008-07-11 11:44
要用到
在此找到,谢谢!
作者: jinsenhome    时间: 2008-07-26 09:01
标题: 可以利用bcp的查询导出功能自行构建
可以利用bcp的查询导出功能自行构建,效率会更好
其他的可以结合存储过程、xp_cmdshell调用bcp
不要见笑,思路而已。不用第三方的软件
作者: hengdd    时间: 2010-10-29 09:40
怎么看不到工具啊




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2