Sql server ID为主键的SQL Server中的BCP移位值
我正在使用Sql server ID为主键的SQL Server中的BCP移位值,sql-server,bcp,Sql Server,Bcp,我正在使用bcp将.csv文件导入SQL Server中的表,如下所示: bcp test1 in "./file.csv" -S server_name -U login_id -P password -d database_name -c -t 我收到以下信息/警告: BCP数据文件中遇到意外的EOF。 bcp复制失败 file.csv数据: A, B, C A, B, C A, B, C A, B, C 我的桌子: CREATE TABLE test2 ( a VARCHAR(
bcp
将.csv
文件导入SQL Server中的表,如下所示:
bcp test1 in "./file.csv" -S server_name -U login_id -P password -d database_name -c -t
我收到以下信息/警告:
BCP数据文件中遇到意外的EOF。bcp复制失败
file.csv
数据:
A, B, C
A, B, C
A, B, C
A, B, C
我的桌子:
CREATE TABLE test2
(
a VARCHAR(8) PRIMARY KEY,
b VARCHAR(8),
c VARCHAR(8)
);
CREATE TABLE test1
(
ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
a VARCHAR(8),
b VARCHAR(8),
c VARCHAR(8)
FOREIGN KEY (a) REFERENCES test2(a)
);
下面是我从test1中选择的SELECT*代码>:
ID | a | b | c |
1 B CA B C
A B CA B C
以下是我的预期:
ID|a |b |c
1 A B C
2 A B C
3 A B C
3 A B C
我对test2
没有任何问题,它几乎类似于test
,但没有ID
。因此,csv
文件格式良好。那我为什么要这样换班呢
编辑1
如果我将标题添加到csv
文件中,我的选择*fromtest1
:
ID|a|b|c |
1 b cA B,C,A,B,C,A,B,C,A,B,C
编辑2
我生成了一个文件格式
,用于指导我的数据
13.0
3
1 SQLCHQR 0 40 "\t" 1 a SQL_Latin1_General_CP1_CI_AS
2 SQLCHQR 0 40 "\t" 2 a SQL_Latin1_General_CP1_CI_AS
3 SQLCHQR 0 40 "\t" 3 a SQL_Latin1_General_CP1_CI_AS
试图“跳转”到ID
13.0
4
1 SQLCHQR 0 40 "\t" 2 a SQL_Latin1_General_CP1_CI_AS
2 SQLCHQR 0 40 "\t" 3 a SQL_Latin1_General_CP1_CI_AS
3 SQLCHQR 0 40 "\t" 4 a SQL_Latin1_General_CP1_CI_AS
但我没办法让它工作
bcp test1 in "./file.csv" -S server_name -U login_id -P password -d database_name -f file_name -t
SQLState=S1002,NativeError=0
错误=[Microsoft][ODBC SQL Server驱动程序]描述符索引无效
编辑3
我找到了解决这个问题的办法,但仍然不是好办法。我所做的是:
更改我的test1
表,将ID
列放在末尾。
然后在my CSV中的每行末尾添加双逗号,以创建一个新的空列。然后我在
中做了一个简单的bcp
。我仍然想在第一列中保留ID
,我只是不想创建一个额外的视图
,将ID
放在前面。第一次编辑,因为-E
开关的含义相反
您缺少-E
,因此BCP
无法知道您正在尝试使用标识列
如果使用此开关,则会从文件中获取值,并忽略SQL Server标识值。您应该在之后执行DBCC CHECKIDENT('table_name',RESEED)
第二次编辑由于更具体的用户呼啸而起
编辑后@BeGreen指定要使用格式化文件
。然后,我将发布如何实现这一点的示例。不需要前面的视图,正如我在关于堆栈溢出的其他帖子中看到的:。
示例不一致,因为CSV混合了“、”
(示例中)和“\t”
(格式表中)。我将在示例中仅使用,“
”
这是可能的,但你必须使用正确的方法
首先,您必须通过以下命令生成格式文件:
bcp <db_name>.dbo.test1 format nul -c -f "generated_format_file.fmt" -t "," -S "<server>\<instance>" -T
*.csv
文件看起来(我已经为测试添加了ID,与应该插入表中的标识值不同):
然后输入正确的命令(注意:使用受信任的连接-T
而不是-U
-p
以缩短行):
要检查当前位于test1的标识值,请执行以下操作:
select IDENT_CURRENT('[database_name].[dbo].[test1]')
结果:
(No column name)
4
尝试将标题添加到csv文件。在post上进行了更新以更好地查看结果。我认为-E
与您所说的正好相反。检查它是否显示:如果未给出-E,则忽略正在导入的数据文件中此列的标识值,SQL Server会根据创建表期间指定的种子值和增量值自动分配唯一值。
我是否应该尝试使用文件格式来忽略ID
列?是的。我将编辑答案。我的意思是,如果您打开了开关,那么您必须为标识列设置自己的ID值。顺便问一下,您是否有设置标识\u INSERT ON
或OFF
?您可以这样做,即打开它,执行bcp插入,然后关闭它,然后执行重新设定种子
(通过DBCC
)标识。您可以添加一个ID列(值为10、20、30),该列将被忽略,以查看插入是否对您正确工作(并使用当前为您的表设置的标识)。我尝试使用文件格式似乎更容易。因此,我生成了一个带有-f
的文件,但无法将其重新使用<代码>bcp表1在“/file.csv”-S server\U name-U login\U id-P password-d database\U name-f format\U file-t
中,但我得到:错误无效描述符索引
`@BeGreen查看我的编辑。所有代码都已在我的SQL 2005测试实例上进行了测试,因此它应该适用于最新的SQL Server。
bcp <db_name>.<schema>.test1 IN "import_data.bcp" -f "generated_format_file.fmt" -t "," -S "<server>\<instance>" -T
Starting copy...
4 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total : 218 Average : (18.35 rows per sec.)
ID a b c
1 A1 B1 C1
2 A2 B2 C2
3 A3 B3 C3
4 A4 B4 C4
select IDENT_CURRENT('[database_name].[dbo].[test1]')
(No column name)
4