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
但这不起作用。
那么我怎样才能使用上述方式?
请帮帮我
答案 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