如何防止MS SQL数据库中的重复?

时间:2016-09-02 11:42:16

标签: sql-server powershell

我有一个PowerShell脚本,它将来自Eventviewer的数据写入MS SQL数据库。

$events = Get-WinEvent @{LogName = "System"; ID = 4720,4726,4741,4743,4727,4730,4728,4729,4740,4767} | Select-Object ID, MachineName, Message, TimeCreated  

$connectionString = "Data Source=Server\INSTANZ;Integrated Security=true;Initial Catalog=Database;"
$bulkCopy = new-object ("Data.SqlClient.SqlBulkCopy") $connectionString
$bulkCopy.DestinationTableName = "Table"
$dt = New-Object "System.Data.DataTable"

# build the datatable
$cols = $events | select -first 1 | get-member -MemberType NoteProperty | select -Expand Name
foreach ($col in $cols)  {$null = $dt.Columns.Add($col)}

foreach ($event in $events)
  {
     $row = $dt.NewRow()
     foreach ($col in $cols) { $row.Item($col) = $event.$col }
     $dt.Rows.Add($row)
  }

 # Write to the database!
 $bulkCopy.WriteToServer($dt)

MS SQL数据库具有行ID,MachineName,Message和TimeCreated。

当我第一次运行脚本时,它完美运行。当我再次运行脚本时,它会再次将所有数据写入数据库。

我怎样才能在两次运行之间写出不同的颜色?

2 个答案:

答案 0 :(得分:0)

您可以在桌面上创建INSTEAD OF触发器:

CREATE TRIGGER SomeTriggerName
ON YourTableName
INSTEAD OF INSERT
AS
MERGE YourTable as t
USING inserted as i
ON i.ID= t.ID
WHEN NOT MATCHED THEN 
    INSERT VALUES (ID, MachineName, Message, TimeCreated)
WHEN MATCHED THEN 
    UPDATE SET MachineName = i.MachineName,
                Message = i.Message,
                TimeCreated = i.TimeCreated

或者您可以直接使用MERGE,而不是INSERTion:

MERGE YourTable as t
USING inserted as i
ON i.ID= t.ID
WHEN NOT MATCHED THEN 
    INSERT VALUES (ID, MachineName, Message, TimeCreated)
WHEN MATCHED THEN 
    UPDATE SET MachineName = i.MachineName,
                Message = i.Message,
                TimeCreated = i.TimeCreated

答案 1 :(得分:0)

尝试使用sql执行此操作

您需要确定sql表中的哪些列使您的记录唯一

然后在使用您的唯一密钥检查已经存在的记录时执行sql插入