我以前利用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的导入导出功能可以吗,我导过可是老是出错啊。
请高手帮忙啊,不胜感激
[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的导入导出功能可以吗,我导过可是老是出错啊。
请高手帮忙啊,不胜感激
解决方案 »
- 求一sql ,关于类似C#中的math.max
- 数据库中没任何数据,每行数据一样!修改不了?
- 谁帮我解释一条语句。
- 聚合函数 count 小问题
- 关于提取text类型字段值的问题
- 怎样写这样的统计语句????
- 请教将表1数据插入表2的问题
- 创建表字段描述里写入字段描述不知道怎么写?
- 请大家帮忙看看这个数据库查询内容转为textbox的有什么问题?老是不对,谢谢!
- 安装SQLSERVER2000时遇到问题,请各位帮忙看看,有没有什么解决办法。(我只能给28分了,这是我的全部)
- 如何将字符串分解为字符,并能自动判断单字节还是双字节?
- SQL Server 2005数据库,在数据库上后边显示(正在恢复),无法使用
tb
col1 col2 ...
val1 val2 ...
...--算法说明:
要实现什么--最终结果:
贴出期望实现的内容
数据库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
;;;;;
;;;;;
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)
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')