Как вставить DataTable с существующим ключом в таблицу SQL Server - PullRequest
3 голосов
/ 18 марта 2010

Я работаю с VB.NET .. У меня есть DataTable с именем «ВОПРОС», содержащий 3 поля:

  • QuestionNumber (уникальный целочисленный ключ)
  • QuestionText
  • QuestionType

В моей базе данных SQL Server я создал таблицу с именем «ВОПРОС» с теми же полями. QuestionNumber определяется как целочисленный уникальный ключ, автоинкремент

Теперь, когда я делаю массовую копию для вставки DataTable в SQL Server, база данных перезаписывает мой QuestionNumber из DataTable и генерирует новые (начиная с 1 с шагом 1).

Как мне изменить настройки базы данных, чтобы исходные номера вопросов копировались в базу данных?

Ответы [ 3 ]

3 голосов
/ 18 марта 2010

Посмотрите ВСТАВКУ ИДЕНТИЧНОСТИ. Вы включаете это. Обновите таблицу, затем выключите ее.

SET IDENTITY_INSERT table ON

Обратите внимание, что вы можете включить его только для одного стола за раз. Если вы включите его для другой таблицы, он отключится на последней таблице.

Если вы вставите значение, которое больше, чем наибольшее существующее значение, оно будет повторно заполнено этим значением, так что все новые значения будут больше.

Опять же, не забудьте выключить его:

SET IDENTITY_INSERT table OFF

Если вы в буквальном смысле делаете BULK INSERT, то не забывайте квалификатор KEEPIDENTITY, который сообщает серверу НЕ игнорировать ваши значения идентификации, в противном случае он игнорирует ваши значения идентификации и генерирует новые значения для столбца идентификации.

Сохранение значений идентичности при массовом импорте данных

2 голосов
/ 18 марта 2010

при использовании только вставки try:

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

при массовом копировании данных необходимо добавить в команду специальный параметр / switch / hint, они подробно описаны здесь:

Сохранение значений идентичности при массовом импорте данных

0 голосов
/ 18 марта 2010

ОК, вот код, который решил мою проблему. Спасибо Маркус и КМ!

' 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()
...