SQL Server BULK INSERT来自不同的模式

时间:2012-09-04 05:28:51

标签: sql-server bulkinsert

我有一个可以从两个外部方更新数据的数据库。 这些方中的每一方都将管道分隔的文本文件BULK INSERTED发送到临时表中。 我现在想通过添加几个列来改变其中一方的方案,但不幸的是,即使新列都被添加为NULLABLE,也会打破另一方的BULK INSERT。

这有什么明显的解决方案吗?

TABLE SCHEMA:

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)+@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 个答案:

答案 0 :(得分:0)

documentation描述了如何使用格式文件来处理目标表的列数多于源文件的情况。有时可以更容易的替代方法是在表格上创建一个视图,并在视图而不是表格中创建BULK INSERT;这种可能性在同一文档中有描述。

请务必提及您的SQL Server版本。

答案 1 :(得分:0)

OPENROWSET与BULK配合使用,可以在查询中使用文件。您可以使用它来格式化数据并仅选择所需的列。

答案 2 :(得分:0)

最后,我用两个不同的BULK INSERT语句处理了两个不同的情况(取决于正在处理的文件)。似乎没有办法做我试图用一个陈述做的事情。

答案 3 :(得分: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)

希望有所帮助!