2014-01-29 2 views
1

테이블 tb2 (QuestionID, QuestionStem, UserID, ExamID) 테이블 tb1 (QuestionID, QuestionStem)에서 두 개의 열 값과 함께 임의로 선택한 행 집합을 삽입하려고합니다 하나의 삽입 쿼리에 대해 고정 된 UserID, ExamID. 나는 webmatrix에서이 쿼리를 시도,하지만 난 @가 삽입 쿼리 한 Statment이 위치에 있으면 안 없다는 오류 가지고 : 어떤 도움에 감사드립니다선택 쿼리 + 변수 값에서 테이블에 삽입

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

: 당신은 당신의 쿼리에서 SELECT 문장의 끝에 ORDER BY NEWID()를 추가하여이를 달성 할 수

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 문에서 '@'기호가 유효한 위치에 있거나 매개 변수가 유효한지 확인하십시오. 설명 : 현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 발생했습니다. 오류 및 코드에서 시작된 위치에 대한 자세한 정보는 스택 추적을 검토하십시오. 예외 정보 : System.Data.SqlServerCe.SqlCeException :이 매개 변수는이 위치에서 사용할 수 없습니다. 이 SQL 문에서 '@'기호가 유효한 위치에 있거나 매개 변수가 유효한지 확인하십시오. – user3139268

+0

문자열에 매개 변수를 직접 연결하여 주입 해킹 벡터를 피하도록주의해야합니다 (둘 다 정수 값이므로 쉽게 이루어져야합니다). – 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

연결을 피하려는 욕구를 이해하고 있기 때문에 귀하의 대답에 동의하지 마십시오. 그러나이 방법은 제 대답보다 효율적이지 않습니다.위험을 이해하고 좀 더 일반적인 의미에서 무엇을하는지 알고있는 한 명령에 형식 안전 정수를 연결하는 데 문제가 없습니다. 트래픽이 적은 웹 사이트의 열 10 행에 대해서만이 방법은 '위험한'위험을 피할 수 있다는 점에서 더 낫지 만 'sql1'이 수천 개의 행을 선택하는 경우 2 밀리 초 대신 완료하는 데 몇 초가 걸릴 수 있습니다. – Polynomial

+0

@Polynomial, 나는 내 솔루션이 당신보다 효율적이지 않다는 것에 동의하지만, 성능이 걱정된다면 Sql Server Compact가 올바른 선택이 아닐 수도 있습니다. 나는 나의 대답을 편집했다. – GmG

+1

공정한 지적이며, 귀하의 편집은 위 표결의 가치가 있습니다. 공평하게 말하자면 질문은 그들이 사용하는 SQL 버전을 명시하지 않습니다 (내 대답에 대한 설명에서 추측 할 수 있지만 질문 자체는 일반적입니다). 각 접근법의 상대적 장단점. 프로그래머가 항상 정보에 입각 한 결정을 내리는 것이 더 좋습니다. – Polynomial

관련 문제