Sql查询结果作为对象数组powershell

Sql查询结果作为对象数组powershell,sql,powershell,Sql,Powershell,我试图对这个查询的结果进行操作,然后对结果的特定值运行更新查询。我试图做的是从表中获取所有值,然后检查这些值是否在1和5之间,并将它们转换为null。由于我无法在一个更新查询中执行此操作,因此我首先对从结果中获得的奇异值进行选择,然后对其进行操作,但查询返回的数据集结果无法在PowerShell中操作,或者至少我不知道如何操作。我能做什么?这项工作的主要目标应该是更新数据库中表的所有列,以更改值介于1和5之间的列,并将它们转换为空值 代码如下: $SQLServer = "Server\SQLE

我试图对这个查询的结果进行操作,然后对结果的特定值运行更新查询。我试图做的是从表中获取所有值,然后检查这些值是否在1和5之间,并将它们转换为null。由于我无法在一个更新查询中执行此操作,因此我首先对从结果中获得的奇异值进行选择,然后对其进行操作,但查询返回的数据集结果无法在PowerShell中操作,或者至少我不知道如何操作。我能做什么?这项工作的主要目标应该是更新数据库中表的所有列,以更改值介于1和5之间的列,并将它们转换为空值 代码如下:

$SQLServer = "Server\SQLEXPRESS"
$SQLDBName = "Prova"
$SqlQuery = "Select * from table_2 where id=1"
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server = $SQLServer; Database = $SQLDBName; trusted_connection=true;"
$SqlConnection.Open()
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = $SqlQuery
$SqlCmd.Connection = $SqlConnection
$SqlAdapter.SelectCommand = $SqlCmd
$Dataset = New-Object System.Data.DataSet
$SqlAdapter.Fill($Dataset)
$array=$Dataset.Tables[0]
$SqlConnection.Close()

我这里有个几个月大的新手,我会试试看

实际上,您可以在数据集的行中循环,访问这些行中的属性列,修改它,然后动态创建update语句并在服务器上执行它

主要部分如下所示,其余只是我自己定义的函数。不确定这是否是您的想法,但我的测试设置是这样的。注意:在运行下面的代码之前,请先在powershell会话中执行/定义函数

 # SET VARIABLES
        $Serv = <Your Server>
        $DB   = <Your DB>
        $TSQL = "SELECT * FROM TestTBL"


# Target Results table from SQL
    $MainResultsTable = (GetSQLData $Serv $DB $TSQL).Tables[0]

#Get Column names
    $Colnames = ($MainResultsTable.Rows | gm -MemberType NoteProperty,Property).Name


# Loop through each row of data from SQL results
    foreach($row in $MainResultsTable.Rows)
    {
        # Construct the TSQL update statement. Using an array to construct the multi column updates.
            $TSQLUpdate = "UPDATE TestTBL SET "
            $TSQLUpdateArr =@()
            foreach($Col in $Colnames)
            {
                # We don't need to update the ID
                    if($Col -ne 'ID')
                    {
                        $TSQLUpdateArr += "$Col = $(EvaluateColumnData $row.$Col)`n" 
                    }
            }
            # join the columns with the corresponding end of TSQL where the target ID is specified
                $TSQLUpdate += $($TSQLUpdateArr -join ",").ToString() + " WHERE ID = $($row.ID);"

            # Execute the update on SQL server
             UpdateSQL $Serv $DB $TSQLUpdate
    }
希望这有帮助。有很多东西你可以读,我还在读lol,它提供了更好的解释,我建议把重点放在基础上


推荐阅读:DataTables,,Functions。

提示:DataSet有表,表中也有行,表中也有列……那么我应该怎么做?类似于$Dataset.Row的内容?您可能需要查看“sqlserver”模块中的“Invoke SQLCmd”。对于那些不想自己创建所有ADO.NET对象的小作业,它会有所帮助。这完全可以在SQLServer中完成。我不知道你到底在改变什么。这里有一个提示:创建表dbo.TABLE_2 id tinyint NULL;在dbo.table_2中插入id值1、2、6、5、7;更新dbo.table_2 SET id=Null OUTPUT deleted.id,其中id介于1和5之间;我试着解释一下,实际上我有一个10列1行的表。该行显示为所有用数字填充的列。我需要做的是从那一行取数字,检查数字是否在我选择的范围内例如:范围在1到5之间,并将那些遵守NULL语句的数字更改为空。因为我不能在一个查询中完成所有这些,我先做一个选择,然后检查所有的数字,然后把它放回数据库进行更新。经过一点研究,我发现我不能用一个简单的更新查询完成所有这些。起初我认为我不能这样做,因为有太多的值要检查,但后来我发现我可以使用switch statemant和添加到update查询的case来处理行和值。谢谢大家的帮助
# Define custom user function to set the values to be used for updating
function EvaluateColumnData()
{
    param( $data )

    if($data -le 5){ return "NULL" }
    else { return $data }
}

# Get data from SQL
function GetSQLData()
{
    param( $tgtServ,$tgtDB,$tgtTSQL )
    # Create connection obj
    $SqlConnection                  = New-Object System.Data.SqlClient.SqlConnection
    $SqlConnection.ConnectionString = "server="+$tgtServ+";database="+$tgtDB+";trusted_connection=true;"

    # Open SQL connection
    $SqlConnection.open()

    # Create TSQL CMD object and pass the connection object
    $SQLCommand                     = New-Object System.Data.SQLClient.SQLCommand
    $SQLCommand.Connection          = $SqlConnection

    # TSQL statement to be executed
    $SQLCommand.CommandText         = $tgtTSQL
    $SQLCommand.CommandTimeOut      = 0

    # Container/adapter for SQL result
    $resultAdapter = New-Object System.Data.SqlClient.SqlDataAdapter($SQLCommand)

    # DataSet where the results are dumped
    $resultDS      = New-Object System.Data.DataSet
    $resultAdapter.Fill($resultDS) | Out-Null
    $SqlConnection.Close()

    return ,$resultDS
}

# Execute TSQL statement without results
function UpdateSQL()
{
    Param( $tgtServ,$tgtDB,$tgtTSQL )
    $ServerConn                  = New-Object System.Data.SQLClient.SQLConnection                               
    $ServerConn.ConnectionString = "server="+$tgtServ+";database="+$tgtDB+";trusted_connection=true;"
    $ServerConn.Open()                               
    $ServerCMD                   = New-Object System.Data.SQLClient.SQLCommand
    $ServerCMD.Connection        = $ServerConn
    $ServerCMD.CommandText       = $tgtTSQL
    $ServerCMD.CommandTimeOut    = 0
    $ServerCMD.ExecuteNonQuery() | out-null
    $ServerConn.Close() 
}