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