2017-06-18 56 views
0

我在SQL Server 2016 Express中创建了一个测试数据库,它包含一个标记为drivers的表。无法从powershell更新SQL Server表

我使用PowerShell执行已安装驱动程序的ciminstance查询,然后将这些值插入到测试数据库驱动程序表中。 (插入按预期工作) 我遇到的问题是试图更新驱动程序表,只有最后一个对象被插入到数据库中40次(即从ciminstance查询返回多少个驱动程序)。我创建了2个PowerShell脚本

  1. 插入值
  2. 更新值

难倒!

$database = 'test' 
$server = 'groga\sqlExpress' 
$table = 'dbo.Driver' 
$SQLServer = "groga\sqlExpress" 
$SQLDBName = "test" 

$SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
$SqlConnection.ConnectionString = "Server = $SQLServer; Database = 
$SQLDBName; Integrated Security = True" 

$SqlConnection.Open() 
$today = Get-Date 

$drivers = gcim win32_pnpsigneddriver -Property * 
$model = gcim win32_computersystem -Property * 
foreach($driver in $drivers) 
{ 
if(!($driver.Description -match "Generic") -and $driver.Manufacturer - 
notmatch 'Microsoft|Standard|Generic' -and $driver.DriverDate -ne $null) 
{ 
    $count = New-Object psobject -Property @{ 

     'Date' = $driver.DriverDate 
     'Manufacturer' = $driver.Manufacturer 
     'Version' = $driver.DriverVersion 
     'PackageID' = "0" 
     'SKU' = $model.SystemSKUNumber 
     'Model' = $model.Model 
     'Today' = $today} 

$col1 = $count.Date 
$col2 = $count.Manufacturer 
$col3 = $count.Version 
$col4 = $count.PackageID 
$col5 = $count.SKU 
$col6 = $count.Model 
$col7 = $count.Today 

$update = @" 
    UPDATE $table 
    SET [Date]='$col1', 
    [Manufacturer]='$col2', 
    [Version]='$col3', 
    [PackageID]='$col4', 
    [SKU]='$col5', 
    [Model]='$col6', 
    [Today]='$col7'  
"@ 

    $dbwrite = $SqlConnection.CreateCommand() 
    $dbwrite.CommandText = $update 
    $dbwrite.ExecuteNonQuery() 
    } 

} 

$Sqlconnection.Close() 
+2

更新记录时要小心。如果您省略'WHERE'子句,**所有**记录将被更新! – JosefZ

+0

谢谢JosefZ,我正在尝试更新所有记录。 – grunzer

回答

0

UPDATE语句将应用于查询所匹配的所有行。因此,你的脚本正在做的是将表中的所有行设置为驱动程序的信息,然后对整个列表进行相同操作。

您需要确定唯一标识每个驱动程序的字段,然后将查询过滤到该字段。看看示例驱动程序信息,这可能是日期,制造商,设备名称(您需要添加到您的模式),DriverVersion。

实例只有日期,生产厂家,DriverVersion:

$update = @" 
    UPDATE $table 
    SET [PackageID] = '$col4' 
    [SKU]='$col5', 
    [Model]='$col6', 
    [Today]='$col7'  
    WHERE [Date] = '$col1' AND [Manufacturer]='$col2' AND [Version]='$col3' 
"@ 
+0

谢谢亚历克,我会重写更新查询和测试 – grunzer