从select query + variables值插入表中

时间:2014-01-29 15:31:18

标签: asp.net insert webmatrix

我想在表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呈现所选行。

2 个答案:

答案 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);