首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有主键Id的Server大容量插入

带有主键Id的Server大容量插入
EN

Stack Overflow用户
提问于 2022-01-29 14:08:18
回答 3查看 701关注 0票数 0

我想将csv文件大容量插入到这个表中。我的csv没有增量pk字段,所以我在没有pk列的情况下创建了这个表的视图,并试图在视图中批量插入。

我还是有个错误

无法将值NULL插入列'CNPJ_ID',表'CVM.dbo.Hist';列不允许空。插入失败。

有什么建议吗?

代码语言:javascript
运行
复制
CREATE TABLE [dbo].[Hist]
(
    [CNPJ_ID] [INT] IDENTITY(1,1) PRIMARY KEY,
    [TP_FUNDO] [text] NULL,
    [CNPJ_FUNDO] [nvarchar](max) NULL,
    [DT_COMPTC] [varchar](50) NOT NULL,
    [VL_TOTAL] [varchar](50) NOT NULL,
    [VL_QUOTA] [varchar](50) NOT NULL,
    [VL_PATRIM_LIQ] [varchar](50) NOT NULL,
    [CAPTC_DIA] [varchar](50) NOT NULL,
    [RESG_DIA] [varchar](50) NOT NULL,
    [NR_COTST] [int] NULL   
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

CREATE VIEW [VWHist] AS
    SELECT 
        [TP_FUNDO],
        [CNPJ_FUNDO],
        [DT_COMPTC],
        [VL_TOTAL],
        [VL_QUOTA],
        [VL_PATRIM_LIQ],
        [CAPTC_DIA],
        [RESG_DIA],
        [NR_COTST]
    FROM 
        Hist;

BULK INSERT [dbo].[VWHist]
FROM 'C:\anaconda3\Docs\2022.csv'
    WITH (
    FIELDTERMINATOR = ';',
    ROWTERMINATOR = '0x0a',
    FIRSTROW =2,
    ROWS_PER_BATCH = 100000
    );
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-01-30 01:23:02

我们没有您的源文件:‘C:\anaconda3 3\Docs\2022.csv’。因此,没有提供最小的重复性例子。

正式文档KEEPIDENTITY清楚地说明了如何处理您的场景:

如果数据文件不包含表或视图中标识列的值,请使用格式文件指定在导入数据时跳过表或视图中的标识列;Server会自动为该列分配唯一值。

这里是一个概念上的例子。

源文件: myIdentity_No_PK.csv

代码语言:javascript
运行
复制
Anthony,Grosse,1980-02-23
Alica,Fatnowna,1963-11-14
Stella,Rosenhain,1992-03-02
Miller,Dylan,1954-01-05

XML格式文件: myIdentity_No_PK.xml

代码语言:javascript
运行
复制
<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <RECORD>
      <FIELD ID="1" xsi:type="CharTerm" TERMINATOR=',' MAX_LENGTH="70"/>
      <FIELD ID="2" xsi:type="CharTerm" TERMINATOR=',' MAX_LENGTH="70"/>
      <FIELD ID="3" xsi:type="CharTerm" TERMINATOR='\r\n' MAX_LENGTH="10"/>
   </RECORD>
   <ROW>
      <COLUMN SOURCE="1" NAME="FirstName" xsi:type="SQLVARYCHAR"/>
      <COLUMN SOURCE="2" NAME="LastName" xsi:type="SQLVARYCHAR"/>
      <COLUMN SOURCE="3" NAME="BirthDate" xsi:type="SQLDATE"/>
   </ROW>
</BCPFORMAT>

SQL

代码语言:javascript
运行
复制
USE tempdb;
GO

DROP TABLE IF EXISTS dbo.myIdentity;

CREATE TABLE dbo.myIdentity ( 
   PersonID smallint IDENTITY(1,1) NOT NULL,
   FirstName varchar(25) NOT NULL,
   LastName varchar(30) NOT NULL,
   BirthDate date
);

INSERT INTO dbo.myIdentity (FirstName, LastName, BirthDate)
SELECT * FROM  OPENROWSET(
BULK 'E:\Temp\myIdentity_No_PK.csv',
FORMATFILE='e:\Temp\myIdentity_No_PK.xml') as t;


-- review results
SELECT * FROM dbo.myIdentity;

输出

代码语言:javascript
运行
复制
+----------+-----------+-----------+------------+
| PersonID | FirstName | LastName  | BirthDate  |
+----------+-----------+-----------+------------+
|        1 | Anthony   | Grosse    | 1980-02-23 |
|        2 | Alica     | Fatnowna  | 1963-11-14 |
|        3 | Stella    | Rosenhain | 1992-03-02 |
|        4 | Miller    | Dylan     | 1954-01-05 |
+----------+-----------+-----------+------------+
票数 1
EN

Stack Overflow用户

发布于 2022-01-29 16:10:38

使用(散装的)。。)代替,您可以编写一个普通的插入.选择。

票数 0
EN

Stack Overflow用户

发布于 2022-01-29 17:02:45

已经有几年了,但是你想要的是bcp -E。除非使用格式文件,否则源文件必须具有与正在加载的表相同的列数。-E选项导致Server忽略标识列的文件中的值,取而代之的是它自己的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70906241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档