Как вставить DataTable с существующим ключом в таблицу SQL Server

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

  • QuestionNumber (уникальный целочисленный ключ)
  • Текст вопроса
  • Тип вопроса

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

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

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


person Olga    schedule 18.03.2010    source источник


Ответы (3)


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

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

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

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

person KM.    schedule 18.03.2010

Найдите ВСТАВКУ ЛИЧНОСТИ. Вы включаете его. Обновите таблицу, затем выключите ее.

SET IDENTITY_INSERT table ON

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

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

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

SET IDENTITY_INSERT table OFF

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

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

person Marcus Adams    schedule 18.03.2010
comment
Спасибо обоим за быстрые ответы. Я пробовал это решение, но теперь я получаю сообщение об ошибке SQL: ex.Message Явное значение должно быть указано для столбца идентификаторов в таблице «IMP_FRAGEN» либо когда для IDENTITY_INSERT установлено значение ON, либо когда пользователь репликации вставляет в столбец идентификаторов NOT FOR REPLICATION. . Строка У кого-нибудь есть идея? - person Olga; 18.03.2010
comment
У вас есть значения для столбца идентификаторов? - person Marcus Adams; 18.03.2010
comment
Да, я нашел проблему. Как написал KM в посте ниже, команде массового копирования нужен еще один параметр. Спасибо, Маркус! - person Olga; 18.03.2010
comment
@ user296575 сказал Yes, I found the Problem. As KM wrote in the post below, the bulk copy command needs another parameter. Thank you Marcus! разве это не должно быть спасибо, КМ?? - person KM.; 18.03.2010
comment
Я действительно думал, что вы имели в виду массовое копирование в более общем смысле, но я также думал, что вы видели бит КМ. Я добавлю его к себе, чтобы сделать его более полным. Спасибо КМ. - person Marcus Adams; 18.03.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()
person Olga    schedule 18.03.2010