2016-04-10 14 views
2

2つのテーブルHistorytablestudentInformation tableがあると仮定します。vb.netとSQL Serverを使用してレコードが存在するかどうかを確認する方法

If schoolyear and level exist in Historytable 
    update studentInformationtable 
else 
    INSERT schoolyear,level to Historytable 
    update studentInformationtable 

私のストアドプロシージャコード:

ALTER PROCEDURE [dbo].[InsertUpdate] 
    @studentID INT, 
    @SchoolYear Nvarchar(20), 
    @levels Nvarchar(20), 
    @FirstName Nvarchar(20), 
    @SurName Nvarchar(20) 
AS 
BEGIN 
    SET NOCOUNT ON; 

BEGIN TRAN 
    IF exists (SELECT SchoolYear, Levels 
       FROM StudentHistory WITH (updlock, serializable) 
       WHERE StudentID = @studentID) 
    BEGIN 
     UPDATE StudentInformation 
     SET FirstName = @FirstName , 
      Surname = @SurName 
     WHERE StudentID = @studentID 
    END 
    ELSE 
    BEGIN 
     INSERT INTO Studenthistory (StudentID, SchoolYear, Levels) 
     VALUES (@studentID, @SchoolYear, @levels) 

     UPDATE StudentInformation 
     SET FirstName = @FirstName, 
      Surname = @SurName 
     WHERE StudentID = @studentID 
    END 

    COMMIT TRAN 
END 

vb.netコード

Using cmd As New SqlClient.SqlCommand("dbo.InsertUpdate", cn) 
    cmd.Parameters.AddWithValue("@studentID", frmView.dgv1.SelectedCells(0).Value) 
    cmd.CommandType = CommandType.StoredProcedure 
    cmd.Parameters.Add("@SurName", SqlDbType.VarChar, 100).Value = txtStudLN.Text 
    cmd.Parameters.Add("@FirstName", SqlDbType.VarChar, 100).Value = txtStudFN.Text 
    cmd.Parameters.Add("@SchoolYear", SqlDbType.VarChar, 100).Value = cboSchoolYear.Text 
    cmd.Parameters.Add("@levels", SqlDbType.VarChar, 100).Value = cboGradeLevel.Text 
    cmd.ExecuteNonQuery() 
    MsgBox("Update New record successfully") 
End Using 

問題:それはないINSERT

は、私は何をしたいのはこれです新しいschoolyearとを挿入すると、履歴テーブルの新しいレコード10。誰かが自分のコードを修正するのを助けることができますか?おかげ

答えて

1

は、代わりにこれを試してみてください:

ALTER PROCEDURE [dbo].[InsertUpdate] 
    -- Add the parameters for the stored procedure here 

@studentID INT, 
@SchoolYear Nvarchar(20), 
@levels Nvarchar(20), 
@FirstName Nvarchar(20), 
@SurName Nvarchar(20) 


AS 
BEGIN 

    SET NOCOUNT ON; 

BEGIN TRAN 

    UPDATE StudentInformation 
    SET FirstName = @FirstName , 
    Surname = @SurName 
    WHERE StudentID = @studentID 

    INSERT INTO Studenthistory (StudentID,SchoolYear, Levels) 
    SELECT @studentID,@SchoolYear,@levels 
    WHERE NOT EXISTS(
     SELECT 1 
     FROM Studenthistory 
     WHERE StudentID = @studentID 
    ) 


COMMIT TRAN 
END 

注:

  1. 場合とそうでない部分の両方に更新ステートメントを記述する必要はありません。
  2. insertステートメントは、selectステートメントがレコードを返す場合にのみ、​​に新しいレコードを追加します。 where句の条件は、1人の学生につき1レコードのみが履歴テーブルに挿入されるようにします。

しかし、私は各生徒のためにただ1つの歴史的記録を保持することに多くの点を見ません。以前の学年や各レベルのレベルを維持したいと思っています。これが真である場合、existsのクエリは次のようになります。

SELECT 1 
FROM Studenthistory 
WHERE StudentID = @studentID 
AND SchoolYear = @SchoolYear, 
AND Levels = @levels 
+0

これは魅力的です。時には英語でのプログラミングで私の問題を説明することは本当に難しいです。笑 。私がしたかったのは、各学年の学年とレベルの前の値を維持することです。忍耐力ありがとうございました:) –

+0

喜んで助けてください:-) –

関連する問題