Я хочу получить новый идентификатор (Identity) перед его вставкой. поэтому используйте этот код:
select SCOPE_IDENTITY() AS NewId from tblName
но получает это:
1- Null
2- Null
ВЫЧИСЛЕННАЯ КОЛОНКА ВЕРСИЯ
Вам нужно будет сделать это на сервере 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
.
Это, однако, не очень хороший дизайн, и я думаю, что неправильное использование того, как генерируются значения идентичности. Также вы должны знать, если вы выполните откат, идентификатор, который был использован, будет потерян и не будет использоваться снова.
Это слишком много для комментария.
Подумайте, насколько это неверно. Идентификатор - это результат подсчета числа попыток вставки. Вы хотите вернуть пользователю идентификатор строки, которая еще не существует. Подумайте, что произойдет, если у вас есть значения во вставке, которые также вызывают сбои. Вы уже сказали пользователю, что будет идентификатором, но вставка не удалась, чтобы идентификация уже была использована. Вы должны сообщить пользователю значение, когда действительно существует строка, которая находится после вставки.
Я не могу понять, почему вы хотите показать эту личность пользователю перед вставкой, я считаю (как сказал @SeanLange), что это не обычай и не полезно, но если вы настаиваете, я думаю, что вы можете сделать некоторые немощные способы. Один из них является
DBCC CHECKIDENT('[Table Name]', RESEED, [Identity Seed])
Другой способ не использовать столбец Identity и управлять столбцом id самостоятельно, и он должен быть ясным, что этот подход не может работать в сценариях параллелизма.
Я думаю, возможно, вы смешиваете идентификатор SQL с последовательностью ORACLE. Они работают совершенно по-другому. После последовательности ORACLE вы получите последовательность перед вставкой записи. С идентификатором SQL, последний идентификатор, созданный ПОСЛЕ вставки, доступной через функцию SCOPE_IDENTITY().
Если вам действительно нужно показывать идентификатор пользователю перед вставкой, лучше всего держать счетчик в отдельной таблице и читать текущее значение и увеличивать его на единицу. Пока "пробелы" в числах не являются проблемой.