【问题标题】:SQL Server identity related errorSQL Server 身份相关错误
【发布时间】:2013-04-25 18:08:21
【问题描述】:

我在 SQL SERVER 2008 中使用此查询..

SET IDENTITY_INSERT ABC ON

BULK 
INSERT ABC
FROM 'F:\test.csv'
WITH
(
    FIELDTERMINATOR = ',',
    ROWTERMINATOR = '\n'
)
GO

并得到一个错误:

必须为表 'ABC' 中的标识列指定显式值 当 IDENTITY_INSERT 设置为 ON 或复制用户 插入 NOT FOR REPLICATION 标识列。

'ABC' 的表结构是:

ID [int] IDENTITY(1,1) NOT NULL,  -- primary key
aa [varchar](50) NULL,
bb [varchar](50) NULL,
cc [datetime] NULL,
dd [varchar](50) NULL,
ee [varchar](50) NULL,
ff [int] NULL,
gg [varchar](50) NULL,
ii [int] NULL,
jj [int] NULL

CSV 文件中的样本数据

84,0b0dbe1d,192.168.10.221,2012-07-27 16:15:41.503,0b0dbe1d_16-15-18,1.0.0,2,pra,2,NULL
85,111de4b6,192.168.10.221,2012-07-27 16:27:06.060,111de4b6_16-27-05,1.0.0,8,Diane,5,NULL

【问题讨论】:

  • 您需要在插入具有标识列的表时明确指定列名。
  • 但在 csv 文件中,这些值在那里..这是我的要求...SET IDENTITY_INSERT ABC ON ..正是出于这个原因,我认为...没有任何方法可以处理这个。

标签: sql-server sql-server-2008 identity-column


【解决方案1】:

James,您收到错误是因为您的 csv 文件包含 9 个列值,但您的表结构包含 10 个列。这就是您收到该错误的原因。 如果你 SET Identity_Insert ABC off 那么你就不会出错了

【讨论】:

    【解决方案2】:

    错误清楚地表明,您需要在插入时指定列名。

    我认为我们没有在批量插入期间指定列名的选项。您可以使用以下替代方法。

     select * into dbo.Stagingtable from ABC where 1=2
        go
    
        BULK 
        INSERT Stagingtable
        FROM 'F:\test.csv'
        WITH
        (
            FIELDTERMINATOR = ',',
            ROWTERMINATOR = '\n'
        )
        GO
        SET IDENTITY_INSERT ABC ON
    GO
        INSERT INto ABC (column1,column2,etc) 
        select * from Stagingtable 
    

    【讨论】:

      【解决方案3】:

      来自Keep Identity Values When Bulk Importing Data (SQL Server)

      防止 SQL Server 批量分配标识值 将数据行导入表中,使用适当的保持身份 命令限定符。当您指定 keep-identity 限定符时,SQL 服务器使用数据文件中的标识值。这些限定符是 如下:

      bcp                                          | -E             |  Switch
      BULK INSERT                                  | KEEPIDENTITY   |  Argument
      INSERT ... SELECT * FROM OPENROWSET(BULK...) | KEEPIDENTITY   |  Table hint
      

      该示例显示了如何在您的情况下应用此药水:

      BULK 
      INSERT ABC
      FROM 'F:\test.csv'
      WITH
      (
          KEEPIDENTITY,  
          FIELDTERMINATOR = ',',
          ROWTERMINATOR = '\n'
      )
      GO
      

      【讨论】:

      • 如果某个值为 NULL,这会是个问题吗..因为我收到一个错误...第 1 行的批量加载数据转换错误(指定代码页的类型不匹配或无效字符),第 9 (ii) 栏。
      • 请针对不同的问题提出单独的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-23
      相关资源
      最近更新 更多