C# sql命令 如果不存在代码错误


    public void Test2()
    {
        string consString = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
        using (SqlConnection con = new SqlConnection(consString))
        {
            con.Open();
            SqlCommand com = new SqlCommand("select * from Temp_Student", con);
            SqlDataReader reader = com.ExecuteReader();
            while (reader.Read())
            {
                string sql = "IF NOT EXISTS (SELECT s_name FROM Student WHERE s_name = @chp1) BEGIN INSERT INTO Student(s_name, s_pass) values(@chp1, @chp2) END";
                string test = "";
                SqlCommand com1 = new SqlCommand(sql, con);
                com1.Parameters.AddWithValue("@chp1", test);
                com1.Parameters.AddWithValue("@chp2", test);
                com1.ExecuteNonQuery();
            }
            con.Close();
        }
    }

目前,我正在尝试将数据从Temp_student表插入到学生表中,但学生表中已经存在的重复项除外。使用当前代码,我没有遇到任何错误,但是在我的学生表上,即使当前没有重复项,也会插入一行空白值。

我想做的是将 Temp_Student 中的 2 列插入到 Student 中,而不会重复,目前这是我被另一个传递的代码的一部分。 我真的不太了解这一点。如果有其他方法,也请向我建议。谢谢

我不知道

您表中的确切列,但您可以执行此操作(针对实际列进行调整(,假设Student_Name是您的主键。

insert into Student
select 
    tmp.Student_Name, tmp.Student_Pass
from
    Temp_Student tmp
    outer join Student stn on tmp.Student_Name = stn.Student_Name
where stn.Student_Name is null

外连接返回 Temp_Student 中的所有记录,无论 Student 中是否存在匹配的记录。当Student中没有匹配的记录时,从该表中选择的列为 null。因此,通过基于此联接进行选择,我们仅返回Temp_Student中与Student不匹配的记录。

您还可以使用 MERGE 语句。很多在 2008 年之前编写 SQL 的人都习惯于用"旧"的方式做这件事,但这更明确。

MERGE Students AS T
USING Temp_Students AS S
ON (T.Student_Name= S.Student_Name) 
WHEN NOT MATCHED BY TARGET  
    THEN INSERT(Student_Name, Student_Pass) VALUES(S.Student_Name, S.Student_Pass);

MERGE必须以分号结尾。从技术上讲,所有语句都应该是,但SQL在MERGE上强制执行它。

最新更新