我有一个可以从两个外部方更新数据的数据库。 这些方中的每一方都将管道分隔的文本文件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)
答案 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)
希望有所帮助!