2012-09-04 4 views
0

2 명의 외부 당사자가 데이터를 업데이트 할 수있는 데이터베이스가 있습니다. 해당 당사자 각각은 준비 테이블에 BULK INSERTED 파이프 구분 텍스트 파일을 보냅니다. 이제는 몇 가지 열을 추가하여 당사자 중 하나의 스키마를 변경하려고하지만, 불행히도 새 열이 모두 NULLABLE로 추가 되더라도 상대방에 대한 BULK INSERT가 손상됩니다.SQL Server 다른 스키마에서 대량 삽입

여기에 분명한 해결책이 있습니까?

테이블 스키마 :

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] 

BULK INSERT 문 :

SET @string_temp = 'BULK INSERT customer_entry_load FROM '+char(39)[email protected] 
[email protected]_file+'.txt'+char(39)+' WITH (FIELDTERMINATOR = '+char(39)+'|'+char(39) 
+', MAXERRORS=1000, ROWTERMINATOR = '+char(39)+'\n'+char(39)+')' 
SET DATEFORMAT dmy 
EXEC(@string_temp) 

답변

0

documentation는 목표 테이블이 소스 파일보다 더 많은 열이 시나리오를 처리하는 서식 파일을 사용하는 방법에 대해 설명합니다. 테이블에보기를 만들고 테이블 대신보기로 BULK INSERT을 만드는 것이 더 쉬운 대안입니다. 이 가능성은 동일한 문서에 설명되어 있습니다.

그리고 항상 SQL Server 버전을 언급하십시오.

+0

안녕하세요, 답장을 보내 주셔서 감사합니다. 어떤 상황에서는 대상이 소스보다 많은 열을 가지고 있고 일부에서는 그렇지 않기 때문에 형식 파일을 사용하는 것이 도움이되었는지 확신하지 못했습니다. 1 BULK INSERT 문을 사용하여이 작업을 수행 할 수있는 방법이 있는지 궁금합니다. SQL Server 버전은 2008 R2 – jazza1000

0

OPENROWSET을 BULK와 함께 사용하면 파일을 쿼리에 사용할 수 있습니다. 이를 사용하여 데이터의 형식을 지정하고 필요한 열만 선택할 수 있습니다.

+0

입니다. 감사합니다. 그 옵션을 알지 못했습니다. 그래도 각 파일에 대해 2 개의 BULK INSERT 문이 필요하지만 사용 방법을 찾을 수 있습니다. – jazza1000

0

결국 두 개의 서로 다른 BULK INSERT 문 (처리중인 파일에 따라 다름)을 사용하여 두 가지 사례를 처리했습니다. 한 문장으로 내가하려고했던 것을 할 방법이없는 것 같습니다.

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)[email protected] 
[email protected]_file+'.txt'+char(39)+' WITH (FORMATFILE = '+char(39)[email protected]+char(39) 
')' 
SET DATEFORMAT dmy 
EXEC(@string_temp) 

희망 하시겠습니까?