无法从powershell更新SQL Server表

无法从powershell更新SQL Server表,powershell,sql-server-2016-express,Powershell,Sql Server 2016 Express,我在SQL Server 2016 Express中创建了一个测试数据库,它包含一个标记为驱动程序的表 我使用PowerShell对已安装的驱动程序执行ciminstance查询,然后将这些值插入测试数据库驱动程序表中。(插入件按预期工作) 我遇到的问题是试图更新驱动程序表,只将最后一个对象插入数据库40次(即从ciminstance查询返回多少个驱动程序)。我已经创建了2个PowerShell脚本 插入值 更新值 难倒了 $database = 'test' $server = 'groga\

我在SQL Server 2016 Express中创建了一个测试数据库,它包含一个标记为
驱动程序的表

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

  • 插入值
  • 更新值
  • 难倒了

    $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()
    

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

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

    仅包含日期、制造商、驱动器版本的示例:

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

    更新记录时要小心。如果省略
    WHERE
    子句,所有记录都将更新!谢谢你JosefZ,我实际上正在尝试更新所有记录。谢谢Alec,我将重写更新查询和测试