【问题标题】:Schedule importing flat files with different names into SQL server 2014计划将具有不同名称的平面文件导入 SQL Server 2014
【发布时间】:2016-01-31 04:43:46
【问题描述】:

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

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

ABCD.100.1601310200
ABCD.101.1601310210
ABCD.102.1601310215

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

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

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

【问题讨论】:

  • 您可以安排三个单独的作业来导入每个文件...这对您有用吗?
  • 每天我会有大约 700 多个文件,每个文件都有不同的文件名(数量递增)。现在,我将这些文件(使用 Windows 批处理)复制到一个文本文件中,并从它们中将其导入数据库。但我正在寻找 SQL Server 中的内置解决方案。
  • "700+ 个文件" > 这是您的问题中应该包含的重要信息!
  • 这些文件在哪里?在一个不包含其他文件的文件夹中?文件数量是固定的还是可以任意添加新文件?它们都共享相同的结构吗?这是添加到您的问题的重要信息。如果没有确切的细节,很难回答您的问题。
  • 此信息应该在您的问题中。使用问题下方的edit 链接编辑您的问题,并将该信息添加到您的问题中。你的问题的细节不应该在 cmets 部分,人们不应该深入研究 cmets 来查看细节是什么。此外,您没有指定文件的数量是否是任意的(任何数量的文件共享文件名中的特定模式)。

标签: sql-server sql-server-2014 sql-server-job


【解决方案1】:

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

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

创建格式文件

这将创建一个用于下一步的格式文件。以下脚本基于现有表在C:\Temp\imp.fmt 中创建格式文件(将TEST_TT 替换为您要导入到的数据库)。这将创建一个以, 作为字段分隔符的格式文件。如果文件有标签作为分隔符,请移除-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-07-11
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多