我知道这个问题已被问过几次,但我需要一个更具体针对我情况的答案。
我使用PowerShell将变量插入SQL中的表中。要插入的重要变量是文件夹的名称。我希望只有在SQL表中不存在这些文件夹名称时才能插入记录。
当我启动脚本时,它会将指定位置的所有文件夹名称收集到一个数组中。现在我已经插入了每个文件夹,但是当我将来运行它时,我希望它只插入新的文件夹。
例如:
说我有这5个文件夹:
让我们说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 + "');"
}
答案 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)
上拥有唯一的索引/合同,以便数据库确保唯一性。然后,如果您一次插入一个,则可以包含代码以捕获错误并忽略重复的键错误。