繁体   English   中英

SQL Server从不同架构中批量插入

[英]SQL Server BULK INSERT FROM different schemas

我有一个数据库,可以从两个外部方更新数据。 这些参与方各自发送一个由管道分隔的文本文件,该文本文件已批量插入到登台表中。 我现在想通过添加几列来更改其中一方的方案,但是不幸的是,即使新列都添加为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)

文档描述了如何使用格式文件来处理目标表比源文件具有更多列的情况。 有时可能更容易的另一种方法是在表上创建视图,然后将视图中的BULK INSERT替换为表。 同一文档中描述了这种可能性。

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

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

最后,我用两个不同的BULK INSERT语句处理了两种不同的情况(取决于要处理的文件)。 似乎没有一种方法可以完成我试图用一个语句执行的操作。

您可以使用@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)

希望有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM