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
上强制执行它。