SQL-сервер вставляет несколько строк и увеличивает столбец int - PullRequest
3 голосов
/ 27 декабря 2010

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

Я делаю следующее, но я знаю, что во вставке что-то не так, потому что увеличенное значение (intCodInterno) всегда одинаково:

INSERT INTO Emp_VISOT.dbo.TBL_GCE_ARTIGOS
        ( strCodigo ,
          strDescricao ,
          intCodInterno ,
          intCodTaxaIvaCompra ,
          intCodTaxaIvaVenda ,
          strCodCategoria ,
          strAbrevMedStk ,
          strAbrevMedVnd ,
          strAbrevMedCmp ,
          bitAfectaIntrastat
        )(
        SELECT  A.Artigo ,
                a.Descricao ,
                IDENT_CURRENT('Emp_VISOT.dbo.TBL_GCE_ARTIGOS')+1,
                '3' ,
                '3' ,
                '1' ,
                'Un' ,
                'Un' ,
                'Un' ,
                '0'
        FROM PRIVESAM.DBO.Artigo A)

Что мне нужно изменить, чтобы корректно увеличить значение?

Спасибо.

EDIT:

Я внес небольшое изменение в запрос, и теперь он работает. Я просто вставляю SELECT в IDENT_CURRENT внутри скобок:

(SELECT IDENT_CURRENT('Emp_VISOT.dbo.TBL_GCE_ARTIGOS')+1)

Я получил все нужные строки из старой таблицы в новую с увеличенным значением.

Ответы [ 4 ]

3 голосов
/ 27 декабря 2010

Удалите деталь с помощью intCodInterno, а в SQL Server используйте свойство Identity , чтобы автоматически увеличить его для вас.

3 голосов
/ 27 декабря 2010

IDENT_CURRENT не будет обновляться, пока транзакция не будет зафиксирована, поэтому его значение остается постоянным до тех пор, пока вы не вставите.

Вот три варианта решения этой проблемы:

  1. Используйте какой-нибудь счетчик (@newRowNum), чтобы для каждой строки в вашем запросе SELECT @newRowNum = @newRowNum +1, и, следовательно, ваш номер intCodInterno = IDENT_CURRENT () + @newRowNum. Это, вероятно, потребует много взлома для работы, хотя. Не рекомендую.

  2. Вставляйте строки последовательно, используя ту же бизнес-логику, что и сейчас - однако она будет значительно менее производительной. Не рекомендую.

  3. Установите этот столбец в вашей целевой таблице в качестве самого столбца идентификации. Это, безусловно, лучший способ сделать это.

Если вам нужна пользовательская функция идентификации (я предполагаю, что есть причина, по которой вы сейчас не используете столбец идентификации), вы можете создать ее, используя некоторые из шагов, описанных выше: http://www.sqlteam.com/article/custom-auto-generated-sequences-with-sql-server

3 голосов
/ 27 декабря 2010

IDENT_CURRENT('Emp_VISOT.dbo.TBL_GCE_ARTIGOS')+1 вычисляется один раз, когда вы хотите выполнить запрос, и все строки получат одинаковый идентификатор.

Первое решение состоит в том, чтобы перебрать результат выбора с помощью конструкции цикла, такой как курсор или что-либо еще, ивставьте увеличенный индекс (вы делаете это)

Второе решение - сделать этот столбец в таблице назначения identity

0 голосов
/ 10 июля 2014

В моем случае я вставил строки последовательно, используя одну и ту же бизнес-логику.Я не могу использовать автоинкремент, так как мне нужно импортировать старые данные также в этот столбец.После того, как вы импортировали данные, вы можете обновить столбец для автоматического увеличения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...