2010-03-18 93 views
3

我与VB.NET的工作..我有一个名为“问题”数据表,包含3个字段:如何插入现有的关键数据表到SQL Server表

  • QuestionNumber(唯一的整数键)
  • QuestionText
  • QuestionType

在我的SQL Server数据库中,我创建了一个名为 “问题” 与相同的字段表。 问题编号被定义为整数唯一键,自动增量

现在,当我做一个批量复制将数据表插入到SQL Server时,数据库覆盖我的问题编号从数据表并生成新的(从1增量1 )。

如何更改我的数据库设置,将原始问题编号复制到数据库中?

回答

2

只是用插入的尝试时:

SET IDENTITY_INSERT [your table] ON 
INSERT INTO [your table] (identityCol, col1,...) VALUES (identityCol, col1,...) 
SET IDENTITY_INSERT [your table] OFF 

当你需要在命令添加特殊参数/开关/提示批量复制数据,他们在这里详细介绍:

Keeping Identity Values When Bulk Importing Data

3

查找IDENTITY INSERT。你打开它。更新表格,然后将其关闭。

SET IDENTITY_INSERT table ON 

请注意,您一次只能在一张桌子上使用它。如果您为其他表格打开它,它将在最后一个表格上关闭。

如果您插入的值高于最大现有值,则会将其自身重新设置为该值,以便所有新值都更大。

再次,不要忘记将其关闭:

SET IDENTITY_INSERT table OFF 

如果你从字面上做BULK INSERT,然后别忘了KEEPIDENTITY预选赛中,它告诉服务器不要忽略你的标识值否则,它将忽略您的标识值并为标识列生成新标识值。

Keeping Identity Values When Bulk Importing Data

+0

感谢您的快速解答。我尝试了这个解决方案,但是现在我得到一个SQL错误: \t \t ex.Message \t“必须为表'IMP_FRAGEN'中的标识列指定显式值,当IDENTITY_INSERT设置为ON或复制用户插入到NOT FOR REPLICATION标识列“。 \t字符串 任何人有一个想法? – Olga 2010-03-18 15:07:47

+0

您是否拥有身份专栏的值? – 2010-03-18 15:32:12

+0

是的,我找到了问题。 KM在下面的帖子中写道,大容量复制命令需要另一个参数。谢谢Marcus! – Olga 2010-03-18 15:48:50

0

好的,这里是解决我的问题的代码。谢谢Marcus和KM!

' set identity_insert to on to insert tables with key' 
     Command = New SqlCommand("SET IDENTITY_INSERT table ON", con) 
     Command.ExecuteNonQuery() 


'Copy dataTable into MSSQL database' 
Using bulkCopy As SqlBulkCopy = New SqlBulkCopy(cn, SqlBulkCopyOptions.KeepIdentity) 
      bulkCopy.DestinationTableName = dTable.TableName 
      Try 
       bulkCopy.WriteToServer(dTable) 
      Catch ex As Exception 
       Console.WriteLine(ex.Message) 
      End Try 
     End Using 

     'disable identity_insert' 
     Command = New SqlCommand("SET IDENTITY_INSERT table OFF", con) 
     Command.ExecuteNonQuery() 
相关问题