--1. 创建如下的存储过程, 实现根据某个fmt文件创建指定名称的表CREATE PROC dbo.p_fmt2table
@tbname sysname,
@fmtfile nvarchar(1000)
AS
--SELECT @tbname = 'tb',
-- @fmtfile = 'c:\test.fmt'
CREATE TABLE #(col nvarchar(4000))
EXEC('BULK INSERT # FROM ''' + @fmtfile + '''')DECLARE @rows varchar(10)
SET ROWCOUNT 2
SELECT @rows = col FROM #
DELETE FROM #
DECLARE @i int
SET @i = @rows
SET ROWCOUNT @iDECLARE @s nvarchar(4000)
SET @s = ''
SELECT @s = @s + ',
' + QUOTENAME(ColName)
+ ' ' + xtype
+ CASE
WHEN xtype IN ('binary','char','nchar','nvarchar','varbinary','varchar','decimal','numeric')
THEN QUOTENAME(datalen, '()')
ELSE '' END
+ CASE
WHEN ColCollate = '' OR ColCollate = '""' THEN ''
ELSE ' COLLATE ' + ColCollate END
FROM(
SELECT id, xtype, plen, datalen, endchar, colid,
ColName = RTRIM(LEFT(col, CHARINDEX(' ', col))),
ColCollate = LTRIM(STUFF(col, 1, CHARINDEX(' ', col), ''))
FROM(
SELECT id, xtype, plen, datalen, endchar,
colid = LEFT(col, CHARINDEX(' ', col)),
col = LTRIM(STUFF(col, 1, CHARINDEX(' ', col), ''))
FROM(
SELECT id, xtype, plen, datalen,
endchar = LEFT(col, CHARINDEX(' ', col)),
col = LTRIM(STUFF(col, 1, CHARINDEX(' ', col), ''))
FROM(
SELECT id, xtype, plen,
datalen = LEFT(col, CHARINDEX(' ', col)),
col = LTRIM(STUFF(col, 1, CHARINDEX(' ', col), ''))
FROM(
SELECT id, xtype,
plen = LEFT(col, CHARINDEX(' ', col)),
col = LTRIM(STUFF(col, 1, CHARINDEX(' ', col), ''))
FROM(
SELECT id,
xtype = STUFF(LEFT(col, CHARINDEX(' ', col)), 1, 3, ''),
col = LTRIM(STUFF(col, 1, CHARINDEX(' ', col), ''))
FROM(
SELECT id = LEFT(col, CHARINDEX(' ', col)),
col = LTRIM(STUFF(col, 1, CHARINDEX(' ', col), ''))
FROM(
SELECT col = REPLACE(col, ' ',' ') + ' ' FROM #
)A
)AA
)AAA
)AAAA
)AAAAA
)AAAAAA
)AAAAAAA
)AAAAAAAA
SET ROWCOUNT 0IF OBJECT_ID(@tbname) IS NOT NULL
EXEC('DROP TABLE ' + @tbname )
SET @s = 'CREATE TABLE ' + @tbname + '(' + STUFF(@s, 1, 1, '') + ')'
PRINT @s
EXEC(@s)
DROP TABLE #
GO
@tbname sysname,
@fmtfile nvarchar(1000)
AS
--SELECT @tbname = 'tb',
-- @fmtfile = 'c:\test.fmt'
CREATE TABLE #(col nvarchar(4000))
EXEC('BULK INSERT # FROM ''' + @fmtfile + '''')DECLARE @rows varchar(10)
SET ROWCOUNT 2
SELECT @rows = col FROM #
DELETE FROM #
DECLARE @i int
SET @i = @rows
SET ROWCOUNT @iDECLARE @s nvarchar(4000)
SET @s = ''
SELECT @s = @s + ',
' + QUOTENAME(ColName)
+ ' ' + xtype
+ CASE
WHEN xtype IN ('binary','char','nchar','nvarchar','varbinary','varchar','decimal','numeric')
THEN QUOTENAME(datalen, '()')
ELSE '' END
+ CASE
WHEN ColCollate = '' OR ColCollate = '""' THEN ''
ELSE ' COLLATE ' + ColCollate END
FROM(
SELECT id, xtype, plen, datalen, endchar, colid,
ColName = RTRIM(LEFT(col, CHARINDEX(' ', col))),
ColCollate = LTRIM(STUFF(col, 1, CHARINDEX(' ', col), ''))
FROM(
SELECT id, xtype, plen, datalen, endchar,
colid = LEFT(col, CHARINDEX(' ', col)),
col = LTRIM(STUFF(col, 1, CHARINDEX(' ', col), ''))
FROM(
SELECT id, xtype, plen, datalen,
endchar = LEFT(col, CHARINDEX(' ', col)),
col = LTRIM(STUFF(col, 1, CHARINDEX(' ', col), ''))
FROM(
SELECT id, xtype, plen,
datalen = LEFT(col, CHARINDEX(' ', col)),
col = LTRIM(STUFF(col, 1, CHARINDEX(' ', col), ''))
FROM(
SELECT id, xtype,
plen = LEFT(col, CHARINDEX(' ', col)),
col = LTRIM(STUFF(col, 1, CHARINDEX(' ', col), ''))
FROM(
SELECT id,
xtype = STUFF(LEFT(col, CHARINDEX(' ', col)), 1, 3, ''),
col = LTRIM(STUFF(col, 1, CHARINDEX(' ', col), ''))
FROM(
SELECT id = LEFT(col, CHARINDEX(' ', col)),
col = LTRIM(STUFF(col, 1, CHARINDEX(' ', col), ''))
FROM(
SELECT col = REPLACE(col, ' ',' ') + ' ' FROM #
)A
)AA
)AAA
)AAAA
)AAAAA
)AAAAAA
)AAAAAAA
)AAAAAAAA
SET ROWCOUNT 0IF OBJECT_ID(@tbname) IS NOT NULL
EXEC('DROP TABLE ' + @tbname )
SET @s = 'CREATE TABLE ' + @tbname + '(' + STUFF(@s, 1, 1, '') + ')'
PRINT @s
EXEC(@s)
DROP TABLE #
GO
-- 下面的批处理循环某个目录下的所有dbf 文件, 并将其导入到指定的表中.
DECLARE @Path nvarchar(1000), @sql nvarchar(1000), @tbname sysnameSELECT @Path = 'c:\' -- dbf 文件所在的目录
,@tbname = 'tb' -- 接收 dbf 文件数据的目的表-- 导入处理
CREATE TABLE #(fname nvarchar(1000))
SET @sql = 'DIR ' + @Path + '*.txt'
INSERT # EXEC master.dbo.xp_cmdshell @sql
IF @@ROWCOUNT = 0
RETURN
DECLARE tb CURSOR LOCAL
FOR
SELECT N'INSERT ' + @tbname + N'
SELECT * FROM OPENROWSET(''MSDASQL'',
''Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=' + @Path + ''',
''SELECT * FROM ' + QUOTENAME(fname) + N''')'
OPEN tb
FETCH tb INTO @sql
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC(@sql)
FETCH tb INTO @sql
END
CLOSE tb
DEALLOCATE tb
DROP TABLE #
所有文件的样式如下:
z_tabCZRZ.dat
z_tabCZRZ.fmt
z_tabBZ.dat
z_tabBZ.fmt
.....
具体的存储过程、创建表的批处理,批处理执行bcp应该怎么写
51
1 SQLINT 1 4 "" 1 KMND
2 SQLCHAR 0 23 "" 2 KMDM
3 SQLCHAR 0 100 "" 3 KMMC
4 SQLINT 1 4 "" 4 KMFL
5 SQLINT 0 4 "" 5 SSZT
6 SQLINT 1 4 "" 6 KMJS
7 SQLINT 1 4 "" 7 DXKM
8 SQLINT 1 4 "" 8 YEFX
9 SQLNUMERIC 1 19 "" 9 QCYE
10 SQLNUMERIC 1 19 "" 10 QCWBYE
11 SQLNUMERIC 1 19 "" 11 QCSL
12 SQLNUMERIC 1 19 "" 12 YE
13 SQLNUMERIC 1 19 "" 13 WBYE
14 SQLNUMERIC 1 19 "" 14 SL
15 SQLNUMERIC 1 19 "" 15 SCYE
16 SQLNUMERIC 1 19 "" 16 SCWBYE
17 SQLNUMERIC 1 19 "" 17 SCSL
18 SQLNUMERIC 1 19 "" 18 NCYE
19 SQLNUMERIC 1 19 "" 19 NCWBYE
20 SQLNUMERIC 1 19 "" 20 NCSL
21 SQLNUMERIC 1 19 "" 21 SSJFRFSE
22 SQLNUMERIC 1 19 "" 22 SSDFRFSE
23 SQLNUMERIC 1 19 "" 23 SSRCXFSE
24 SQLNUMERIC 1 19 "" 24 SSJFYFSE
25 SQLNUMERIC 1 19 "" 25 SSDFYFSE
26 SQLNUMERIC 1 19 "" 26 SSYCXFSE
27 SQLNUMERIC 1 19 "" 27 SSJFJFSE
28 SQLNUMERIC 1 19 "" 28 SSDFJFSE
29 SQLNUMERIC 1 19 "" 29 SSJCXFSE
30 SQLNUMERIC 1 19 "" 30 SSJFNFSE
31 SQLNUMERIC 1 19 "" 31 SSDFNFSE
32 SQLNUMERIC 1 19 "" 32 SSNCXFSE
33 SQLNUMERIC 1 19 "" 33 SSJFLFSE
34 SQLNUMERIC 1 19 "" 34 SSDFLFSE
35 SQLNUMERIC 1 19 "" 35 SSLCXFSE
36 SQLNUMERIC 1 19 "" 36 JFRFSE
37 SQLNUMERIC 1 19 "" 37 DFRFSE
38 SQLNUMERIC 1 19 "" 38 RCXFSE
39 SQLNUMERIC 1 19 "" 39 JFYFSE
40 SQLNUMERIC 1 19 "" 40 DFYFSE
41 SQLNUMERIC 1 19 "" 41 YCXFSE
42 SQLNUMERIC 1 19 "" 42 JFJFSE
43 SQLNUMERIC 1 19 "" 43 DFJFSE
44 SQLNUMERIC 1 19 "" 44 JCXFSE
45 SQLNUMERIC 1 19 "" 45 JFNFSE
46 SQLNUMERIC 1 19 "" 46 DFNFSE
47 SQLNUMERIC 1 19 "" 47 NCXFSE
48 SQLNUMERIC 1 19 "" 48 JFLFSE
49 SQLNUMERIC 1 19 "" 49 DFLFSE
50 SQLNUMERIC 1 19 "" 50 LCXFSE
51 SQLINT 1 4 "" 51 SCBZ
文件夹里还有这个文件
Script.dat用记事本打开内容如下好像是创建所有表的语句,
?嘟 _ O Title J WIDTH ,Script J WIDTH @ z _ t a b B Z ?C R E A T E T A B L E [ d b o ] . [ z _ t a b B Z ] (
[ S S Z T ] [ i n t ] N O T N U L L ,
[ B Z D M ] [ i n t ] N O T N U L L ,
[ B Z M C ] [ c h a r ] ( 2 0 ) N U L L ,
[ B Z J C ] [ c h a r ] ( 1 0 ) N U L L ,
[ B Z B Z ] [ c h a r ] ( 4 ) N U L L ,
[ B Z H L ] [ n u m e r i c ] ( 1 5 , 4 ) N U L L ,
[ S C B Z ] [ i n t ] N U L L
) O N [ P R I M A R Y ]
z _ t a b C Z R Z JC R E A T E T A B L E [ d b o ] . [ z _ t a b C Z R Z ] (
[ S S Z T ] [ i n t ] N U L L ,
[ C Z D M ] [ i n t ] N U L L ,
[ C Z Y H ] [ c h a r ] ( 2 0 ) N U L L ,
[ C Z R Q ] [ d a t e t i m e ] N U L L ,
[ W C Q K ] [ i n t ] N U L L
) O N [ P R I M A R Y ]
z _ t a b D Q P Z |C R E A T E T A B L E [ d b o ] . [ z _ t a b D Q P Z ] (
[ P Z D M ] [ i n t ] N O T N U L L ,
[ P Z L X ] [ i n t ] N O T N U L L ,
[ P Z L X H ] [ i n t ] N U L L ,
[ Z D S D ] [ i n t ] N U L L ,
[ Q T M K P Z ] [ i n t ] N U L L ,
[ S S Z T ] [ i n t ] N O T N U L L ,
[ P Z R Q N ] [ i n t ] N O T N U L L ,
[ P Z R Q Y ] [ i n t ] N O T N U L L ,
[ P Z R Q R ] [ i n t ] N U L L ,
[ C J Y H ] [ c h a r ] ( 2 0 ) N U L L ,
[ S H Y H ] [ c h a r ] ( 2 0 ) N U L L ,
[ S H B Z ] [ i n t ] N U L L ,
[ J Z B Z ] [ i n t ] N O T N U L L ,
[ J Z Y H ] [ c h a r ] ( 2 0 ) N U L L ,
[ F D Z S ] [ i n t ] N U L L ,
[ P Z Z Y ] 等等
例如下面的这段, 你把 create table 前面的 z _ t a b D Q P Z |换成go就行了.
) O N [ P R I M A R Y ]
z _ t a b D Q P Z |C R E A T E T A B L E [ d b o ] . [ z _ t a b D Q P Z ] (
当然, 在执行下面的语句之前, 你要执行之前我帖出的那个存储过程的代码创建存储过程
(不然根据fmt文件建表的语句会写得很复杂)
-- 根据fmt文件建表DECLARE @Path nvarchar(1000), @sql nvarchar(1000), @tbname sysnameSELECT @Path = 'd:\test' -- fmt 文件所在的目录-- 导入处理
CREATE TABLE #(fname nvarchar(1000))
SET @sql = 'DIR ' + @Path + '*.fmt'
INSERT # EXEC master.dbo.xp_cmdshell @sql
IF @@ROWCOUNT = 0
RETURN
DECLARE tb CURSOR LOCAL
FOR
SELECT N'EXEC p_fmt2table @tbname = ' + QUOTENAME(LEFT(fname, LEN(fname) - 4), '''') + N'
@fmtfile = ''' + @Path + fname + ''''
FROM #
OPEN tb
FETCH tb INTO @sql
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC(@sql)
FETCH tb INTO @sql
END
CLOSE tb
DEALLOCATE tb
DROP TABLE #
CREATE TABLE #(fname nvarchar(1000))
SET @sql = 'DIR ' + @Path + '*.fmt'
INSERT # EXEC master.dbo.xp_cmdshell @sql
IF @@ROWCOUNT = 0
RETURN
DECLARE tb CURSOR LOCAL
FOR
SELECT N'BCP ' + DB_NAME() + '.dbo.' + LEFT(fname, LEN(fname) - 4)
+ N' IN "' + @Path + LEFT(fname, LEN(fname) - 4) + '.dat" '
+ N' /f"' + @Path + fname + '" /T /S"' + @@SERVERNAME + '"'
FROM #
OPEN tb
FETCH tb INTO @sql
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC master.dbo.xp_cmdshell @sql
FETCH tb INTO @sql
END
CLOSE tb
DEALLOCATE tb
DROP TABLE #
(所影响的行数为 7 行)服务器: 消息 170,级别 15,状态 1,行 2
第 2 行: '@fmtfile' 附近有语法错误。
服务器: 消息 170,级别 15,状态 1,行 2
第 2 行: '@fmtfile' 附近有语法错误。
服务器: 消息 170,级别 15,状态 1,行 2
第 2 行: '@fmtfile' 附近有语法错误。
服务器: 消息 170,级别 15,状态 1,行 2
第 2 行: '@fmtfile' 附近有语法错误。
CREATE TABLE #(fname nvarchar(1000))
SET @sql = 'DIR ' + @Path + '*.fmt'
INSERT # EXEC master.dbo.xp_cmdshell @sql
IF @@ROWCOUNT = 0
RETURN
DECLARE tb CURSOR LOCAL
FOR
SELECT N'EXEC p_fmt2table @tbname = ' + QUOTENAME(LEFT(fname, LEN(fname) - 4), '''') + N'
,@fmtfile = ''' + @Path + fname + ''''
FROM #
OPEN tb
FETCH tb INTO @sql
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC(@sql)
FETCH tb INTO @sql
END
CLOSE tb
DEALLOCATE tb
DROP TABLE #