0

2 つの外部関係者からデータを更新できるデータベースがあります。これらの各関係者は、ステージング テーブルに BULK INSERTED されたパイプ区切りのテキスト ファイルを送信します。いくつかの列を追加して一方の当事者のスキームを変更したいのですが、残念ながら、新しい列がすべて NULLABLE として追加されているにもかかわらず、これは他方の当事者の BULK INSERT を壊しています。

これに対する明らかな解決策はありますか?

テーブル スキーマ:

CREATE TABLE [dbo].[CUSTOMER_ENTRY_LOAD](
[CARD_NUMBER] [varchar](12) NULL,
[TITLE] [varchar](6) NULL,
[LAST_NAME] [varchar](34) NULL,
[FIRST_NAME] [varchar](40) NULL,
[MIDDLE_NAME] [varchar](40) NULL,
[NAME_ON_CARD] [varchar](26) NULL,
[H_ADDRESS_PREFIX] [varchar](50) NULL,
[H_FLAT_NUMBER] [varchar](5) NULL,
[H_STREET_NUMBER] [varchar](10) NULL,
[H_STREET_NUMBER_SUFFIX] [varchar](5) NULL,
[H_STREET] [varchar](50) NULL,
[H_SUBURB] [varchar](50) NULL,
[H_CITY] [varchar](50) NULL,
[H_POSTCODE] [varchar](4) NULL,
[P_ADDRESS_PREFIX] [varchar](50) NULL,
[P_FLAT_NUMBER] [varchar](5) NULL,
[P_STREET_NUMBER] [varchar](10) NULL,
[P_STREET_NUMBER_SUFFIX] [varchar](5) NULL,
[P_STREET] [varchar](50) NULL,
[P_SUBURB] [varchar](50) NULL,
[P_CITY] [varchar](50) NULL,
[P_POSTCODE] [varchar](4) NULL,
[H_STD] [varchar](3) NULL,
[H_PHONE] [varchar](7) NULL,
[C_STD] [varchar](3) NULL,
[C_PHONE] [varchar](10) NULL,
[W_STD] [varchar](3) NULL,
[W_PHONE] [varchar](7) NULL,
[W_EXTN] [varchar](5) NULL,
[DOB] [smalldatetime] NULL,
[EMAIL] [varchar](50) NULL,
[DNS_STATUS] [bit] NULL,
[DNS_EMAIL] [bit] NULL,
[CREDITCARD] [char](1) NULL,
[PRIMVISACUSTID] [int] NULL,
[PREFERREDNAME] [varchar](100) NULL,
[STAFF_NUMBER] [varchar](50) NULL,
[CUSTOMER_ID] [int] NULL,
[IS_ADDRESS_VALIDATED] [varchar](50) NULL
) ON [PRIMARY]

一括挿入ステートメント:

SET @string_temp = 'BULK INSERT customer_entry_load FROM '+char(39)+@inpath
+@current_file+'.txt'+char(39)+' WITH (FIELDTERMINATOR = '+char(39)+'|'+char(39)
+', MAXERRORS=1000,  ROWTERMINATOR = '+char(39)+'\n'+char(39)+')'
SET DATEFORMAT dmy
EXEC(@string_temp)
4

4 に答える 4

0

このドキュメントでは、フォーマット ファイルを使用して、ターゲット テーブルにソース ファイルよりも多くの列があるシナリオを処理する方法について説明しています。より簡単な場合がある別の方法は、テーブル上にビューを作成し、テーブルでBULK INSERTはなくビューにビューを作成することです。この可能性については、同じドキュメントに記載されています。

また、常に SQL Server のバージョンについて言及してください。

于 2012-09-04T08:31:17.053 に答える
0

@Pondlife が提供するフォーマット ファイルのアイデアを使用できます。

入力ファイル名に基づいて挿入を動的に調整します (外部関係者間に固有の違いがある場合)。CASE ステートメントを使用して、ファイル名の一意の識別子に基づいて正しい形式のファイルを選択するだけです。

DECLARE @formatFile varchar (max);

Set @formatFile =
CASE 
    WHEN @current_file LIKE '%uniqueIdentifier%'
    THEN 'file1' 
    ELSE 'file2'
END

SET @string_temp = 'BULK INSERT customer_entry_load FROM '+char(39)+@inpath
+@current_file+'.txt'+char(39)+' WITH (FORMATFILE = '+char(39)+@formatFile+char(39)
')'
SET DATEFORMAT dmy
EXEC(@string_temp)

それが役立つことを願っています!

于 2013-01-08T22:57:11.530 に答える
0

OPENROWSETを BULK と共に使用すると、クエリでファイルを使用できます。これを使用してデータをフォーマットし、必要な列のみを選択できます。

于 2012-09-04T08:37:42.593 に答える
0

最後に、2 つの異なる BULK INSERT ステートメントを使用して 2 つの異なるケースを処理しました (処理されるファイルによって異なります)。私がやろうとしていたことを1つのステートメントで実行する方法がないようです。

于 2012-09-06T20:07:56.533 に答える