【问题标题】:SQL Server BULK INSERT FROM different schemasSQL Server BULK INSERT 从不同的架构
【发布时间】:2012-09-04 05:28:51
【问题描述】:

我有一个可以从两个外部方更新数据的数据库。 每一方都发送一个管道分隔的文本文件,该文件被 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)

【问题讨论】:

    标签: sql-server bulkinsert


    【解决方案1】:

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

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

    【讨论】:

    • 您好,感谢您的回复。我不确定使用格式文件是否有帮助,因为在某些情况下,目标的列比源的列多,而在某些情况下则没有。我想知道是否有办法通过 1 BULK INSERT 语句来完成此操作? SQL Server 版本是 2008 R2
    【解决方案2】:

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

    【讨论】:

    • 谢谢,我不知道这个选项。不过,每个文件仍然需要 2 个 BULK INSERT 语句,但我也许能找到一种使用它的方法
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      希望有帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-15
        • 1970-01-01
        • 1970-01-01
        • 2013-06-06
        • 2011-10-31
        • 2016-11-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多