安排将具有不同名称的平面文件导入SQL Server 2014

时间:2016-01-31 04:43:46

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

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

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

ABCD.100.1601310200
ABCD.101.1601310210
ABCD.102.1601310215

命名惯例: 这里第一部分'ABCD'保持不变,中间部分是序列id,每个文件的增量顺序。最后一部分是时间戳。

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

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

1 个答案:

答案 0 :(得分:0)

可能还有其他方法,但这是一种方式:

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

    创建格式文件

    这将创建一个格式文件,以便在下一步中使用。以下脚本基于现有表在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;