存储过程中的问题

时间:2011-04-03 08:29:39

标签: c# sql-server tsql

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 个答案:

答案 0 :(得分:6)

而不是

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()

答案 1 :(得分:4)

你不应该在那里使用"exec"

exec的作用是:

  

执行命令字符串或字符   Transact-SQL批处理中的字符串,或   以下模块之一:system   存储过程,用户定义存储   过程,标量值用户定义   功能,或扩展存储   过程

您应该使用“set”或“select”而不是exec。

  

SET只能分配一个变量   一段时间,SELECT可以制作多个   一次分配。分配时   来自查询,如果没有值   然后返回SET将分配   NULL,其中SELECT不会   完全分配(所以变量   不会改变它以前的   值)

您可以在此处找到有关何时使用SET或SELECT的更多信息:SET vs SELECT when assigning variables

样品:

set @quesion_id = (select Question_ID from QuestionEntry)
select @quesion_id = (select Question_ID from QuestionEntry)

但这也是从插入记录中获取身份值的错误方法。如果你有N个用户同时执行相同的过程,你可能会得到错误的值(从最后插入的记录)。

要做到这一点,您应该使用@@IDENTITY或更好SCOPE_IDENTITY()。更多信息:here

INSERT之后,您只需致电:

SELECT @quesion_id = @@IDENTITY
--or
SELECT @quesion_id = SCOPE_IDENTITY()

另外,检查您的Question_ID配置是否正确。它应该设置为自动增量。

样品:

Question_ID int IDENTITY(1,1)PRIMARY KEY CLUSTERED

IDENTITY关键字后面的1表示SEED编号(表中第一条记录的值)和增量属性(0或1)。

答案 2 :(得分:3)

如果您的服务器版本是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