2014-01-29 108 views
1

我想從表tb2(QuestionID,QuestionStem)中隨機選擇一組行隨同兩列的值一起插入表tb2(QuestionID,QuestionStem,UserID,ExamID) UserID,ExamID,它們對於一個插入查詢是固定的。我曾嘗試在WebMatrix中此查詢,但我得到了一個錯誤,@不應該在插入查詢statment這個位置:從select查詢+變量值插入表

db.Query("INSERT INTO tb2 (QuestionID, QuestionStem, UserID, ExamID) SELECT QuestionID, QuestionStem, @UserID, @ExamID FROM tb2"); 

任何幫助表示讚賞。我正在使用webmatrix 3.0來構建我的應用程序。 請注意,插入後的UPDATE語句將無法正常工作,因爲會出現同時出現的用戶,我想根據每個用戶的UserID和ExamID顯示選定的行。

回答

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行是隨機選擇的。如果你想將其限制在一定數量的行唯一可以做的(例如,用十行)

db.Query("INSERT INTO tb2 (QuestionID, QuestionStem, UserID, ExamID) SELECT QuestionID, QuestionStem, @0, @1 FROM tb1 ORDER BY NEWID", userId, examId); 

:您可以在您的查詢中添加ORDER BY NEWID()SELECT語句的結束實現這一

db.Query("INSERT INTO tb2 (QuestionID, QuestionStem, UserID, ExamID) SELECT TOP 10 QuestionID, QuestionStem, @0, @1 FROM tb1 ORDER BY NEWID", userId, examId); 
+0

它沒有工作。錯誤信息:此位置不允許有參數。確保'@'符號位於有效位置,或者該SQL語句中的參數有效。 描述:執行當前Web請求期間發生未處理的異常。請查看堆棧跟蹤以獲取有關該錯誤的更多信息以及源代碼的位置。 異常詳細信息:System.Data.SqlServerCe.SqlCeException:此位置不允許使用參數。確保'@'符號位於有效位置,或者該SQL語句中的參數有效。 – user3139268

+0

我想你可以直接連接參數到字符串中,注意避免注入hack向量(應該很簡單,因爲它們都是整數值)。 – Polynomial

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); 
} 
+0

不要不同意你的答案,因爲我明白了避免串聯的願望,但是這種方法的效率比我的答案低了一個數量級。只要您瞭解風險並意識到自己在更廣義的意義上所做的工作,就不會發現將類型安全整數連接成命令的問題。對於只有十行的網站來說,流量很小,這種方法更好,因爲它避免了'危險'的地面,但是如果'sql1'選擇了數千行,則可能需要幾秒鐘才能完成,而不是幾毫秒。 – Polynomial

+0

@Polynomial,我同意你的觀點,即我的解決方案效率低於你的解決方案,但是,如果性能是一個問題,也許Sql Server Compact不是正確的選擇。我編輯了我的答案。 – GmG

+1

一個公平的點,你的編輯值得投票。儘管如此,這個問題並沒有說明他們使用的SQL版本(我知道你可以從我的回答的評論中推斷出它,但問題本身已經足夠普遍),我會說通過每種方法的相對優點和缺點。對於程序員能夠做出明智的決定總是更好。 – Polynomial