簡體   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