как использовать SCOPE_IDENTITY () не во вставке

1

Я хочу получить новый идентификатор (Identity) перед его вставкой. поэтому используйте этот код:

select SCOPE_IDENTITY()  AS NewId from tblName

но получает это:

1- Null

2- Null

  • 3
    Зачем вам нужно значение перед вставкой?
  • 0
    Существует ли спецификация идентификатора для столбца в этой таблице?
Показать ещё 12 комментариев
Теги:
entity-framework
sql-server-2008

4 ответа

3
Лучший ответ

ВЫЧИСЛЕННАЯ КОЛОНКА ВЕРСИЯ

Вам нужно будет сделать это на сервере sql, чтобы добавить столбец.

alter table TableName add Code as (name + cast(id as varchar(200)))

Теперь ваш результирующий набор всегда будет иметь код в качестве значения имени + id, хорошо, потому что этот столбец будет обновляться с этим выражением, даже если поле изменяется (например, имя).


Опция Entity Framework (менее идеальна)

Вы упомянули, что используете Entity Framework. Вам нужно объединить идентификатор в поле в пределах одной записи во время вставки. В SQL (за пределами триггеров) или Entity Framework нет возможности выполнять то, что вы хотите сделать за один шаг.

Вам нужно сделать что-то вроде этого:

var obj = new Thing{ field1= "some value", field2 = ""};
context.ThingTable.Add(obj);
context.SaveChanges();
obj.field2 = "bb" + obj.id; //after the first SaveChanges is when your id field would be populated
context.SaveChanges();

ORIGINAL Ответ: Если вы действительно должны показывать это значение пользователю, то безопасный способ сделать это будет примерно таким:

begin tran
insert into test(test) values('this is something')
declare @pk int = scope_identity()
print @pk

Теперь вы можете вернуть значение в @pk и дать пользователю определить, приемлемо ли оно. Если он затем выдает команду COMMIT else, ROLLBACK команду ROLLBACK.

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

  • 1
    И заблокировать систему на неопределенный промежуток времени, пока пользователь не отправит?
  • 0
    Разве это не заблокировало бы таблицу ожидающей вставкой? Не вся БД.
Показать ещё 8 комментариев
3

Это слишком много для комментария.

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

  • 0
    Итак, я изменил это на, я использовал это во вставке и новом файле. пожалуйста, помогите мне в этом в рамках Entity. но я получаю SCOPE_IDENTITY () перед вставкой идентификатора.
  • 0
    Вы не можете использовать SCOPE_IDENTITY, чтобы получить значение строки, прежде чем вставить ее. Не существует Легко и просто. Если вы собираетесь использовать идентификационные данные в той же таблице, что и данные, это не поможет.
Показать ещё 2 комментария
1

Я не могу понять, почему вы хотите показать эту личность пользователю перед вставкой, я считаю (как сказал @SeanLange), что это не обычай и не полезно, но если вы настаиваете, я думаю, что вы можете сделать некоторые немощные способы. Один из них является

  • 1) Вставьте новую строку, затем введите ID с SCOPE_IDENTITY() и покажите пользователю
  • 2) Затем, если вы хотите отменить операцию, удалите строку и сбросьте
    (если необходимо) с помощью DBCC CHECKIDENT('[Table Name]', RESEED, [Identity Seed])

Другой способ не использовать столбец Identity и управлять столбцом id самостоятельно, и он должен быть ясным, что этот подход не может работать в сценариях параллелизма.

  • 0
    но я использовал новый идентификатор в записи. (Id = 1, Name = аа, код = AA1). (Id = 2, имя = бб, код = ВВ2). Код = Имя + Идентификатор не проблема в использовании в сети? Как я могу использовать это?
  • 0
    @kakamishoo Пожалуйста, подробнее опишите. Я не могу понять, что именно вы хотите сделать. Если вы можете улучшить свой вопрос с более подробной информацией или скажите мне здесь.
Показать ещё 2 комментария
0

Я думаю, возможно, вы смешиваете идентификатор SQL с последовательностью ORACLE. Они работают совершенно по-другому. После последовательности ORACLE вы получите последовательность перед вставкой записи. С идентификатором SQL, последний идентификатор, созданный ПОСЛЕ вставки, доступной через функцию SCOPE_IDENTITY().

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню