1

私は SQL Server の初心者であり、スクリプトはまだあまり洗練されていません。以下の問題について提案が必要です。

次のように、リモートサーバーから自分のマシンにファイルを受信します(約700 /日):

ABCD.100.1601310200
ABCD.101.1601310210
ABCD.102.1601310215

命名規則: ここで、最初の部分 'ABCD' は同じままです。中間部分は、すべてのファイルの増分順のシーケンス ID です。最後の部分はタイムスタンプです。

ファイル構造 ファイルに特定の拡張子はありませんが、メモ帳/Excel で開くことができます。したがって、フラット ファイルと呼ぶことができます。各ファイルは 95 列と 20000 行で構成され、列 1 の上 4 行と下 4 行にガベージ値が固定されています。

ここで、スケジューラを使用してこれらのフラット ファイルからデータをインポートできる SQL サーバーにデータベースを作成する必要があります。提案が必要です。

4

1 に答える 1

0

これを行うにはおそらく他の方法がありますが、これは 1 つの方法です。

  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;

これを実行する前に、xp_cmdshellストアド プロシージャを許可するように SQL Server を再構成します。これは一度だけ行う必要があります。

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 に答える