2010-12-27 3 views
3

Добрый день,SQL-сервер вставляет несколько строк и увеличивает значение столбца int

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

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

Я делаю это так, но я знаю, что что-то во вкладыше не так, потому что увеличивается значение (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:

Я сделал небольшое изменение в запросе, и теперь он работает. Я просто вставить ВЫБРАТЬ в IDENT_CURRENT в скобках:

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

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

Спасибо всем за помощь.

+0

Если вы используете 'IDENT_CURRENT', который означает, что у вас есть столбец« IDENTITY »в этой таблице; просто не указывайте этот столбец в списке столбцов и не вставляйте ему никаких значений - столбец «IDENTITY» автоматически получит новое уникальное значение, когда произойдет INSERT .... –

ответ

3

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

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

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

+0

К сожалению, в таблице назначения уже существует столбец с IDENTITY. –

+0

искать способ использования значения этого столбца для значения столбца intCodInterno, sth, как постоянный вычисленный столбец или ... –

3

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

2

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

Вот три варианта для фиксации этой проблемы:

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

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

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

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

0

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

Смежные вопросы