我以前利用foxpro编程语言合并过上百张表结构完全相同的表,思路是这样的:遍历每个表(这些表都放在一个目录下),然后把每个表的记录输出到一个新表,并且给新表增加一个新字段,这个字段为单位号+人员号(应为这些表都是grw001.grw002这样的表,001,002表示单位号码,每个表中的id代表人员号码,单位号+人员号表示一个人员的唯一号码)。代码如下:
[code=Vf]m.lcPath = GETDIR( '', '选择单位数据文件所在的文件夹。', '选择文件夹', 64 )ADIR( laUnits, m.lcPath + 'dw*.dbf' )
FOR m.ii = 1 TO ALEN( m.laUnits, 1 )
    m.lcFile = m.lcPath + m.laUnits[m.ii, 1]
    m.lcUnitCode = SUBSTR( m.lcFile, 3, 5 )
    TRY
        USE ( m.lcFile ) IN SELECT('curunit') ALIAS curunit EXCLUSIVE
        ALTER TABLE curunit ADD COLUMN code1 C(???)    && 合并后的字段宽度要你自己决定
        UPDATE curunit SET code1 = m.lcUnitCode + code
    CATCH
        MESSAGEBOX( '单位代码为 ' + m.lcUnitCode + ' 的表无法打开。', 48, '', 5000 )
    ENDTRY
ENDFORIF USED( 'curunit' )
    m.lcNewFile = PUTFILE( '合并表后表名:', '合并表', 'dbf' )
    SELECT * FROM curunit INTO TABLE (m.lcNewFile) WHERE .F.
    USE IN curunit
    USE ( m.lcNewFile ) ALIAS allunits EXCLUSIVE
    FOR m.ii = 1 TO ALEN( m.laUnits, 1 )
        m.lcFile = m.lcPath + m.laUnits[m.ii, 1]
        WAIT WINDOW NOWAIT NOCLEAR '正在合并 ' + m.laUnits[m.ii, 1] + ' ... ' ;
            + TRANSFORM(( m.ii - 1 ) * 100 / ALEN(m.laUnits, 1) ) + '%'
        APPEND FROM ( m.lcFile )
    ENDFOR
    WAIT CLEAR
    FLUSH IN allunits
    MESSAGEBOX( '合并完成,合并后数据保存在 ' + m.lcNewFile + ' 文件中。', 64, '' )
ELSE
    MESSAGEBOX( '没有处理任何 XXXXXXXX。', 48, '' )
ENDIF[/code]
现在我想在sql server 2005中实现这些表的合并(因为我们接触到得表大多数都是sql server的),因此我首先想到通过编程方法实现,结果我发现sql缺少此类函数,很多人让我使用:
select '0001'+id as Newid,... from dw0001
union all
select '0002'+id as Newid,... from dw0002
union all
select '0003'+id as Newid,... from dw0003
union all但是这样得些上百甚至上万行程序,真的很麻烦,有没有更好的方法。
另外没有的话,我想把sql中的表导出为foxpro表,使用sql server 2005的导入导出功能可以吗,我导过可是老是出错啊。
请高手帮忙啊,不胜感激

解决方案 »

  1.   

    --测试数据
    tb
    col1 col2 ...
    val1 val2 ...
    ...--算法说明:
    要实现什么--最终结果:
    贴出期望实现的内容
      

  2.   

    行,我详细说明一下吧:
    数据库a,a中的表为grw0001,grw1000,grw0008.......grw1803(0001,0002,0003等为单位编码,这些表的结构都是一样的,列字段为:id,name,age....(id是唯一的,并且是从00001开始的)
    要实现的是把grw哪些表合并为一张表b,
    最终结果:b表的结构为:
    did        id     name age 
    000100001  00001
    000100002  00002
    100000001  00001
    100000002  00002
    180300001  00001
    180300002  00002
    ;;;;;
    ;;;;;
      

  3.   

    DECLARE @s VARCHAR(MAX)
    SELECT @s = ISNULL(@s+' UNION ALL SELECT '''+STUFF(name, 1, 3, '')+'''+LTRIM(id),id,name,age FROM '+name, 
               'SELECT did='''+STUFF(name, 1, 3, '')+'''+LTRIM(id),id,name,age FROM '+name) 
    FROM sysobjects
    WHERE TYPE = 'u'
    AND name LIKE 'grw%'
    EXEC(@s)
      

  4.   

    你好,ht1258,你这个程序很好,对我很有用,但是我想把结果保存成grwhb表,而不仅仅是显示现实出来,这个怎么做呢
      

  5.   

    --原表不存在的情况:
    DECLARE @s VARCHAR(MAX)
    SELECT @s = ISNULL(@s+' UNION ALL SELECT '''+STUFF(name, 1, 3, '')+'''+LTRIM(id),id,name,age FROM '+name, 
               'SELECT did='''+STUFF(name, 1, 3, '')+'''+LTRIM(id),id,name,age FROM '+name) 
    FROM sysobjects
    WHERE TYPE = 'u'
        AND name LIKE 'grw%'
    EXEC('SELECT * INTO grwhb FROM ('+@s+') t')--原表存在的情况:
    DECLARE @s VARCHAR(MAX)
    SELECT @s = ISNULL(@s+' UNION ALL SELECT '''+STUFF(name, 1, 3, '')+'''+LTRIM(id),id,name,age FROM '+name, 
               'SELECT did='''+STUFF(name, 1, 3, '')+'''+LTRIM(id),id,name,age FROM '+name) 
    FROM sysobjects
    WHERE TYPE = 'u'
        AND name LIKE 'grw%'
    EXEC('INSERT INTO grwhb SELECT * FROM ('+@s+') t')