我想在表tb2(QuestionID,QuestionStem,UserID,ExamID)中插入一组从表tb1(QuestionID,QuestionStem)中随机选择的行以及为一个插入修复的两列UserID,ExamID的值查询。我在webmatrix中尝试过这个查询,但是我在插入查询语句中遇到了@不应该在这个位置的错误:
db.Query("INSERT INTO tb2 (QuestionID, QuestionStem, UserID, ExamID) SELECT QuestionID, QuestionStem, @UserID, @ExamID FROM tb2");
感谢任何帮助。我正在使用webmatrix 3.0来构建我的应用程序。 注意,插入后的UPDATE语句将不起作用,因为会有同时用户,我想基于每个用户的UserID和ExamID呈现所选行。
答案 0 :(得分:1)
使用Webmatrix中的单个参数化查询无法完成任务,在我看来,创建查询连接参数并不是一个好的解决方案。
更好的替代方案是从表t1中提取您需要的记录,并使用foreach循环逐个插入它们:
@{
var userId = 25;
var examId = 32;
var sql1 = "SELECT TOP 10 QuestionID, QuestionStem FROM t1 ORDER BY NEWID()";
var sql2 = @"INSERT INTO tb2 (QuestionID, QuestionStem, UserID, ExamID)
VALUES (@0, @1, @2, @3)";
var db = Database.Open("yourDb");
var data = db.Query(sql1);
foreach (var row in data){
db.Execute(sql2, row.QuestionID, row.QuestionStem, userId, examId);
}
}
<强>被修改强>
如果性能是一个真正的问题,最好的解决方案可能是将数据从Sql Server Compact迁移到Sql Server Express。
在此环境中,您可以创建一个存储过程,如
CREATE PROCEDURE AddQuestions @UserID int, @ExamID int
AS
INSERT INTO dbo.tb2 (QuestionID, QuestionStem, UserID, ExamID)
SELECT TOP 10 QuestionID, QuestionStem, @UserID AS UserID, @ExamID AS ExamID
FROM dbo.t2 ORDER BY NEWID()
GO
并在WebMatrix中回忆起它:
@{
var userId = 14;
var examId = 16;
var db = Database.Open("yourDb");
var data = db.Execute("EXEC AddQuestions @UserID = @0, @ExamID = @1",
userId, examId);
}
答案 1 :(得分:0)
如果我理解正确,您可以使用带编号的序数作为两个参数。像这样的东西,但设置变量以适当地使用你的数据当然:
var userId = 0;
var examId = 0;
db.Query("INSERT INTO tb2 (QuestionID, QuestionStem, UserID, ExamID) SELECT QuestionID, QuestionStem, @0, @1 FROM tb1", userId, examId);
您还提到您希望随机选择tb1
中的行。您可以通过在查询中ORDER BY NEWID()
语句的末尾添加SELECT
来实现此目的:
db.Query("INSERT INTO tb2 (QuestionID, QuestionStem, UserID, ExamID) SELECT QuestionID, QuestionStem, @0, @1 FROM tb1 ORDER BY NEWID", userId, examId);
如果你想将它限制为多行,你可以做(例如,有十行):
db.Query("INSERT INTO tb2 (QuestionID, QuestionStem, UserID, ExamID) SELECT TOP 10 QuestionID, QuestionStem, @0, @1 FROM tb1 ORDER BY NEWID", userId, examId);