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表中的数据插入到Student表中,但Student表中已存在的重复项除外。使用当前代码我不会遇到任何错误,但在我的Student表上,即使当前没有重复项,也会插入一行空值。
我想要做的是将Temp_Student中的2列插入到学生中而不重复,目前这是我被另一个传递的代码的一部分。我真的不太了解这一点。如果还有其他方式,请向我建议。谢谢
答案 0 :(得分:1)
我不知道表格中的确切列,但您可以这样做(根据实际列进行调整),假设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
中没有匹配的记录,则从该表中选择的列为空。因此,通过根据此加入进行选择,我们只返回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
上强制执行。