我使用bulk insert
语法将每日文件上传到SQL
,目前正在寻找在duplicates
auto-incrementing
列之后避免行ID
的方法并将其设置为primary key
。作为所用表格的说明:
CREATE TABLE dupli
(
ID int IDENTITY(1000,1) NOT NULL PRIMARY KEY,
period date NOT NULL,
fruits varchar(MAX) NOT NULL,
num int NOT NULL,
)
假设dupli.csv
包含:
4/20/2011, apple, 5
SQL
会在文件上传后自然检索到:
1000¦2011-04-20¦apple¦5¦
漏洞:如果有人错误地上传了同一个文件而没有检查ex-ante
是否存在2011-04-20
的某些数据,那么会创建一个重复的行
1001¦2011-04-20¦apple¦5¦
依旧......
这似乎正常,ID
已auto-incremented
。但是,我想知道是否有方法,以保持ID
自动递增,同时避免重复行?意思是我能得到:
1000¦2011-04-20¦apple¦5¦
1001¦2011-04-21¦apple¦5¦
...
但从不
1000¦2011-04-20¦apple¦5¦
1001¦2011-04-20¦apple¦5¦
否则bulk insert
不会执行。
目的是避免创建function
,在执行bulk insert
(仅一次)之前,每天检查预先存在的数据是否存在。到目前为止,这是我能想到保留上表结构并避免重复的唯一方法。
提前致谢
答案 0 :(得分:0)
为什么不创建,然后批量插入临时表。之后,您可以发出一个简单的合并或(甚至更简单的)外部联接插入语句来更新dupli。一旦连接被丢弃并且连接丢失,临时表将被丢弃。所以没有整理工作。
using (var connection = new SqlConnection(Strings.connection_string))
using (var command = new SqlCommand() { Connection = connection })
{
command.CommandText = "CREATE TABLE #dupli (period date, fruits varchar(MAX), num int, primary key (period, fruits))";
connection.Open();
command.ExecuteNonQuery();
//Now do your bulk insert to #dupli
// issue a merge statement (or simple left outer join insert) to update the target table
/*
insert into dupli(period, fruits, num)
select #dupli.period, #dupli.fruits, #dupli.num
from #dupli left outer join dupli
on #dupli.period = dupli.period
and #dupli.fruits = dupli.fruits
where dupli.ID is null
*/
}