0

我有一个数据库,可以从两个外部方更新数据。每一方都发送一个管道分隔的文本文件,该文件被 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 语句(取决于正在处理的文件)处理了两种不同的情况。似乎没有办法做我试图用一个语句做的事情。

于 2012-09-06T20:07:56.533 回答
0

使用带有 BULK 的OPENROWSET允许您在查询中使用您的文件。您可以使用它来格式化数据并仅选择您需要的列。

于 2012-09-04T08:37:42.593 回答
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

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

请始终提及您的 SQL Server 版本。

于 2012-09-04T08:31:17.053 回答