私は毎日、ファイルから 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で効果的な方法でそれを達成することさえ可能ですか?