仅插入SQL记录(如果它们不存在)

时间:2016-01-29 21:39:00

标签: sql sql-server powershell duplicates sql-insert

我知道这个问题已被问过几次,但我需要一个更具体针对我情况的答案。

我使用PowerShell将变量插入SQL中的表中。要插入的重要变量是文件夹的名称。我希望只有在SQL表中不存在这些文件夹名称时才能插入记录。

当我启动脚本时,它会将指定位置的所有文件夹名称收集到一个数组中。现在我已经插入了每个文件夹,但是当我将来运行它时,我希望它只插入新的文件夹。

例如:

说我有这5个文件夹:

  • C:\用户\ User.Name \ 2015年1月1日
  • C:\用户\ User.Name \ 2015年2月1日
  • C:\用户\ User.Name \ 2015年3月1日
  • C:\用户\ User.Name \ 2015-04-01
  • C:\用户\ User.Name \ 2015年5月1日

让我们说2015-01-01,2015-02-01和2015-03-01已经在表格中。我在PowerShell中收集的数组将包含所有5个文件夹。

我只使用了5个文件夹作为示例,实际上我需要为大约100个文件夹执行此操作,因此我不能为每个文件夹进行硬编码。

如何在表格中仅插入2015-04-01和2015-05-01?这是需要在SQL级别完成的事情,还是我的PowerShell数组更复杂的事情?

以下是我在PowerShell中收集数组的方法:

$Location = 'C:\Users\User.Name'

$FolderArray = gci -Path $Location | Where-Object {$_.Name -like '2015*' } | Where-Object {$_.PSIsContainer} | Foreach-Object {$_.Name}

这是SQL的样子:

Foreach ($i in $FolderArray) 
{
    $sql ="INSERT INTO Database.dbo.Table ([Location]) VALUES ('" + $i + "');"
}

2 个答案:

答案 0 :(得分:0)

您可以在SQL级别执行此操作。

IF NOT EXISTS( SELECT `Location` FROM Database.dbo.Table WHERE `Location`= '2015-01-01')
BEGIN
     INSERT INTO Database.dbo.Table ([Location]) VALUES ('2015-01-01');
END

答案 1 :(得分:0)

您可以使用单个查询(无if)执行此操作:

INSERT INTO Database.dbo.Table([Location])
    SELECT location
    FROM (VALUES('2015-01-01')) as l(location)
    WHERE NOT EXISTS (SELECT 1 FROM Database.dbo.Table t WHERE t.location = l.location);

使用此结构,您甚至可以构建查询以同时包含所有值。

但是,如果您进行更新,则应在table(location)上拥有唯一的索引/合同,以便数据库确保唯一性。然后,如果您一次插入一个,则可以包含代码以捕获错误并忽略重复的键错误。