Вы не должны использовать "exec" там.
Что exec делает:
Выполняет командную строку или строку символов в Transact-SQLпакет или один из следующих модулей: системная хранимая процедура, пользовательская хранимая процедура, скалярная пользовательская функция или расширенная хранимая процедура.
Вы должны использовать «set» или «select»"вместо exec.
SET
можно назначать только одну переменную за раз, SELECT
может выполнять несколько назначений одновременно.При присваивании из запроса, если не возвращено значение, то SET
назначит NULL
, где SELECT
вообще не будет выполнять присваивание (поэтому переменная не будет изменена с предыдущего значения)
Более подробную информацию о том, когда использовать SET или SELECT, можно найти здесь: SET против SELECT при назначении переменных
Пример:
set @quesion_id = (select Question_ID from QuestionEntry)
select @quesion_id = (select Question_ID from QuestionEntry)
Но это такженеправильный способ получить значение идентичности из вставленной записи.Если у вас N пользователей выполняют одну и ту же процедуру одновременно, может случиться так, что вы получите неправильное значение (из последней вставленной записи).
Чтобы сделать это правильно, вы должны использовать @@IDENTITY
или даже лучше SCOPE_IDENTITY()
.Дополнительная информация: здесь .
После INSERT вы можете просто позвонить:
SELECT @quesion_id = @@IDENTITY
--or
SELECT @quesion_id = SCOPE_IDENTITY()
Кроме того, проверьте, правильно ли настроен ваш Question_ID.Следует установить автоматическое приращение.
Пример:
Question_ID int IDENTITY(1,1)PRIMARY KEY CLUSTERED
1, следующие за ключевым словом IDENTITY, указывают номер SEED (значение для первой записи в таблице) и свойство приращения (0 или 1).).