0

私は毎日、ファイルから SQL Server データベース テーブルにデータをインポートする作業を担当しています。一括挿入を行うためのさまざまな方法を調査しましたbcpが、スケジュールされたタスクを毎日実行して、コマンドラインからユーティリティを使用することを考えました。

私の最大の問題は、bcp を使用してデータをインポートするときに日付を変換する方法がわからないこと、または日付を変換できるかどうかさえわからないことです。たとえば、SQL型dd.mm.yyyyとして保存できなかった形式の日付フィールドがあります。datetime

ファイルは毎日更新されます (現在、約 200 万行または 255 MB のデータがあります)。これが機能する方法は、以前のすべてのデータとファイルの末尾にいくつかの新しいデータを含む新しいファイルが毎日作成されることです。ファイルの最初の行には、データのヘッダーが含まれています。続くデータはセミコロンで区切られ、各行は . で終わり\nます。実際のファイルには 16 の列があるため、例で単純化しました。

data.txt:

NUMBER;START_DATE;END_DATE;GROUP_ID;IS_OPEN;TOTAL;
2262101;02.10.2010;01.11.2010;123456789012345678;0;268,75;
2291245;01.11.2010;01.12.2010;123456789012345678;0;67,25;
etc...


私が作成したフォーマットファイルを以下に示します(これも列数が少ない例です)。形式 (DD.MM.YYYY) が原因で不可能と思われるため、現在、日付を SQLDATETIME としてインポートしていません。

format.fmt:

10.0
4   
1       SQLINT     0 0  ""   1 Id        ""
2       SQLCHAR    0 4  ";"  2 Number    ""
3       SQLCHAR    0 50 ";"  3 StartDate Finnish_Swedish_CI_AS
4       SQLCHAR    0 50 ";"  4 EndDate   Finnish_Swedish_CI_AS
5       SQLCHAR    0 20 ";"  5 GroupId   Finnish_Swedish_CI_AS
6       SQLBIT     0 1  ";"  6 IsOpen    ""
7       SQLDECIMAL 0 18 "\n" 7 Total     ""


コマンドの場合、テーブル/データベース、データ ファイル、フォーマット ファイル、-T = 信頼できる接続、および -F = 最初の行 2 を指定して、ヘッダー行をスキップします。

コマンドで:

bcp [database].[dbo].[table] in C:\...\data.txt -f C:\...\format.fmt -T -F 2


データベース テーブル:

CREATE TABLE [dbo].[table](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Number] [int] NOT NULL,
    [StartDate] [varchar](50) NULL,
    [EndDate] [varchar](50) NULL,
    [GroupId] [varchar](50) NULL,
    [IsOpen] [bit] NULL,
    [Total] [decimal](18, 2) NULL

私の考えは、日付を文字列として保存し、 を使用して読み取ることでしたが、それは形式CAST(StartDate as datetime)では機能しないようでした。dd.mm.yyyyも実行してみset dateformat dmyました。

そのため、毎日何千もの行をデータベース テーブルに自動的にインポートする必要があり、この手順で日付を datetime に変換する必要があります。これを行うための(パフォーマンスに関して)最良の方法は何ですか?bcpで効果的な方法でそれを達成することさえ可能ですか?

4

1 に答える 1