Проблема в хранимой процедуре - PullRequest
1 голос
/ 03 апреля 2011
create procedure InsertQuestionEntry
@round_name varchar(40),
@question varchar(100),
@answer varchar(40),
@option1 varchar(20),
@option2 varchar(30),
@option3 varchar(30)

as
begin
insert into QuestionEntry(Question,Round_Name) values(@question,@round_name);
declare @quesion_id int

exec @quesion_id= select Question_ID from QuestionEntry;

insert into Answer(Question_ID,Answer,Option1,Option2,Option3) values(@quesion_id,@answer,@option1,@option2,@option3);
end

Здесь я хочу извлечь Question_ID из таблицы QuestionEntry и использовать это Question_ID для другой таблицы Answer

Но это не сработало.

Так как я могу использовать вышеуказанный способ?

, пожалуйста, помогите мне

Ответы [ 3 ]

6 голосов
/ 03 апреля 2011

Вместо

insert into QuestionEntry(Question,Round_Name) values(@question,@round_name);
declare @quesion_id int

exec @quesion_id= select Question_ID from QuestionEntry;

используйте следующее:

DECLARE @quesion_id int
INSERT INTO QuestionEntry(Question,Round_Name) values(@question,@round_name)
SET @quesion_id = SCOPE_IDENTITY()
4 голосов
/ 03 апреля 2011

Вы не должны использовать "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).).

3 голосов
/ 03 апреля 2011

Если версия вашего сервера SQL Server 2005 или выше, вы также можете попробовать что-то вроде этого:

create procedure InsertQuestionEntry
  @round_name varchar(40),
  @question varchar(100),
  @answer varchar(40),
  @option1 varchar(20),
  @option2 varchar(30),
  @option3 varchar(30)
as
begin
  insert into QuestionEntry(Question,Round_Name)
  output inserted.Question_ID, @answer, @option1, @option2, @option3
    into Answer  (Question_ID, Answer,  Option1,  Option2,  Option3)
  values(@question,@round_name);
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...