Получить автоматически увеличенное значение поля в SQL Server 2008 из кода C # - PullRequest
1 голос
/ 03 декабря 2011

У меня есть следующая таблица:

tbl_ProductCatg

Id    IDENTITY
Code
Description
a few more.

Поле идентификатора автоматически увеличивается, и мне нужно вставить это значение в поле кода.

т.е. если сгенерированный Id равен 1, то в поле кода значение должно быть вставлено как 0001 (отформатировано так, чтобы иметь длину четыре), если id равно 77, код должен быть 0077.

Для этого я сделал запрос вроде:

insert into tbl_ProductCatg(Code,Description)
values(RIGHT('000'+ltrim(Str(SCOPE_IDENTITY()+1,4)),4),'testing')

Этот запрос хорошо работает в анализаторе запросов sql server, но если я напишу это в C #, тогда он вставит Null в Code, даже поле Id будет обновлено хорошо.

Спасибо

Ответы [ 2 ]

4 голосов
/ 03 декабря 2011

Возможно, вы захотите взглянуть на Вычисляемые столбцы ( Определение )

Судя по тому, что вы пытаетесь сделать, это будет хорошо для вас.

CREATE TABLE tbl_ProductCatg
(
   ID INT IDENTITY(1, 1)
   , Code AS RIGHT('000' + CAST(ID AS VARCHAR(4)), 4)
   , Description NVARCHAR(128)
)

или

ALTER TABLE tbl_ProductCatg
ADD Code AS RIGHT('000' + CAST(id AS VARCHAR(4)), 4)

Вы также можете сделать столбец PERSISTED, чтобы он не вычислялся при каждой ссылке на него.

Пометка столбца какPERSISTED Указывает, что компонент Database Engine будет физически сохранять вычисленные значения в таблице и обновлять значения при обновлении любых других столбцов, от которых зависит вычисляемый столбец.

0 голосов
/ 03 декабря 2011

К сожалению, SCOPE_IDENTITY не предназначен для использования во время вставки, поэтому значение не будет заполнено, пока не произойдет вставка.

Три решения, которые я вижу, - это создать хранимую процедуру для генерации идентификатора области, а затем обновить поле.

insert into tbl_ProductCatg(Description) values(NULL,'testing')
update tbl_ProductCatg SET code=RIGHT('000'+ltrim(Str(SCOPE_IDENTITY()+1,4)),4) WHERE id=SCOPE_IDENTITY() 

Второй вариант - продвинуться дальше и превратить его в триггер, работающий при UPDATE и INSERT.Меня всегда учили избегать триггеров, где это возможно, и вместо этого делать что-то на уровне SP, но в некоторых случаях триггеры оправданы.

Третий вариант - это вычисляемые поля, как описано @Adam Wenger

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