1

因为我是 SQL Server 的初学者,我的脚本还不是很完善。我需要关于以下问题的建议。

我从远程服务器接收文件到我的机器(每天大约 700 个),如下所示:

ABCD.100.1601310200
ABCD.101.1601310210
ABCD.102.1601310215

命名约定: 这里的第一部分'ABCD'保持不变,中间部分是一个序列ID,每个文件都按递增顺序排列。最后一部分是时间戳。

文件结构 该文件没有任何特定的扩展名,但可以用记事本/excel打开。因此可以称为平面文件。每个文件由 95 列和 20000 行组成,在第 1 列的顶部 4 行和底部 4 行固定有一些垃圾值。

现在,我需要在 SQL Server 中创建一个数据库,我可以在其中使用调度程序从这些平面文件中导入数据。需要建议。

4

1 回答 1

0

可能还有其他方法可以做到这一点,但这是一种方法:

  1. 为您的表格创建一个格式文件。您只需要创建一次。在步骤 2 的导入脚本中使用此文件。
  2. 根据以下内容创建导入脚本OPENROWSET(BULK '<file_name>', FORMATFILE='<format_file>'
  3. 在 SQL Server 中安排步骤 2 中的脚本以针对您希望导入数据的数据库运行

创建格式文件

这将创建一个格式文件以在下一步中使用。以下脚本C:\Temp\imp.fmt基于现有表创建格式文件(替换 TEST_TT为您要导入到的数据库)。这将创建一个带有,as 字段分隔符的格式文件。如果文件有选项卡作为分隔符,请移除该-t,开关。

DECLARE @cmd VARCHAR(8000);
SET @cmd='BCP TEST_TT.dbo.[ABCD.100.1601310200] format nul -f "C:\Temp\imp.fmt" -c -t, -T -S ' + (SELECT @@SERVERNAME);
EXEC master..xp_cmdshell @cmd;

在执行此操作之前,您将重新配置 SQL Server 以允许xp_cmdshell存储过程。您只需执行一次。

EXEC sp_configure 'show advanced options', 1 
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1 
GO
RECONFIGURE
GO

导入脚本

该脚本假定:

  • 需要将文件导入到单独的表中
  • 这些文件位于C:\Temp
  • 格式文件为C:\Temp\imp.fmt(上一步生成的)

SET NOCOUNT ON;
DECLARE @store_path VARCHAR(256)='C:\Temp';
DECLARE @files TABLE(fn NVARCHAR(256));
DECLARE @list_cmd VARCHAR(256)='DIR ' + @store_path + '\ABCD.* /B';
INSERT INTO @files EXEC master..xp_cmdshell @list_cmd;
DECLARE @fullcmd NVARCHAR(MAX);
SET @fullcmd=(
    SELECT
        'IF OBJECT_ID('''+QUOTENAME(fn)+''',''U'') IS NOT NULL DROP TABLE '+QUOTENAME(fn)+';'+
        'SELECT * INTO '+QUOTENAME(fn)+' '+
        'FROM OPENROWSET(BULK '''+@store_path+'\'+fn+''',FORMATFILE=''C:\Temp\imp.fmt'') AS tt;'
    FROM 
        @files 
    WHERE 
        fn IS NOT NULL
    FOR XML PATH('')
);
EXEC sp_executesql @fullcmd;
于 2016-01-31T13:51:25.007 回答