0

VBスクリプトから変換した次のPowerShellコマンドがあります。

$conn = New-Object System.Data.SqlClient.SqlConnection(“Data Source=SERVER; Initial Catalog=DATABASE; Integrated Security=SSPI”) 
$conn.Open() 
$cmd1 = $conn.CreateCommand() 
$cmd1.CommandType = [System.Data.CommandType]::Text 
$cmd1.CommandText =“SELECT guid, name, [Serial Number] FROM dbo.wrksta as a inner join Inv_AeX_HW_Serial_Number as b on a.GUID=b._resourceGUID ORDER BY Name” 
$data = $cmd1.ExecuteReader() 
$cmd2 = $conn.CreateCommand() 
$cmd2.CommandType = [System.Data.CommandType]::Text 
$cmd2.CommandText =“SELECT top 1 [User] FROM dbo.Evt_aex_client_logon WHERE _resourceGuid = (SELECT top 1 Guid FROM dbo.Wrksta WHERE Name='" + $data["name"] + "' ORDER BY WrkstaID DESC) AND Event = 'logon' AND _eventTime > getdate()-60 GROUP BY [User] ORDER BY count([User]) desc” 
$data2 = $cmd2.ExecuteReader() 
$dt = new-object “System.Data.DataTable” 
$dt.Load($data2) 
$dt | format-table 
$conn.Close() 

2番目のselectステートメントを見ると、最初の変数$ dataの値を使用したいのですが、その記述方法がわかりません。VBでは、次のようになりました。WHERE Name ='"+workstation(" name ")。value +"'は、PowerShellでこれを記述する正しい方法は次のとおりです。'"+ $ data [" name "]+"'。$date変数に格納されているname列の値の後のIm

以前にこれを行うために使用されたVBは以下のとおりです

connString = "Provider=sqloledb;Data Source=SERVER;Initial Catalog=DATABASE;Integrated Security=SSPI;"
objSQL.Open connString 

sqlWorkstations = "SELECT guid, name, [Serial Number] FROM dbo.wrksta as a inner join Inv_AeX_HW_Serial_Number as b on a.GUID=b._resourceGUID ORDER BY Name"
Set workstation = objSQL.Execute(sqlWorkstations)

Do Until (workstation.EOF)

sqlUser = "SELECT top 1 [User] FROM dbo.Evt_aex_client_logon WHERE _resourceGuid = (SELECT top 1 Guid FROM dbo.Wrksta WHERE Name='" + workstation("name").value + "' ORDER BY WrkstaID DESC) AND Event = 'logon' AND _eventTime > getdate()-60 GROUP BY [User] ORDER BY count([User]) desc"
set user = objSQL.Execute(sqlUser)

if not user.eof then
  userName = user("User").value
else
  username = "??????"
end if
4

2 に答える 2

2

自分で物事をはるかに簡単にし、SqlServerCmdletSnapin100スナップインをロードします。SQL Serverを扱っている場合は、ボイラープレートのほとんどを処理し、実行中のクエリを単一のコマンドレットに抽出します。

上記のコードは、最初のクエリが単一の行のみを返すことを前提としています。これは常に当てはまる場合とそうでない場合があります。私はあなたのデータベースを知りません。複数のレコードが返される場合、コードは最初のクエリの最初のレコードに対応するデータのみを提供します。

を使用して、複数SqlServerCmdletSnapin100Invoke-SQLCmdレコードが返される場合を処理するには、次のようにします。

$data1 = Invoke-Sqlcmd -ServerInstance SERVER -Database DATABASE -Query “SELECT guid, name, [Serial Number] FROM dbo.wrksta as a inner join Inv_AeX_HW_Serial_Number as b on a.GUID=b._resourceGUID ORDER BY Name”;
foreach ($row in $data1) {
    $name = $row.name;
    $data2 = invoke-sqlcmd -ServerInstance SERVER -Database DATABASE -Query “SELECT top 1 [User] FROM dbo.Evt_aex_client_logon WHERE _resourceGuid = (SELECT top 1 Guid FROM dbo.Wrksta WHERE Name='$name' ORDER BY WrkstaID DESC) AND Event = 'logon' AND _eventTime > getdate()-60 GROUP BY [User] ORDER BY count([User]) desc” ;
    $data2 |ft -AutoSize
}

また、適切に記述された1つのクエリですべてのデータを取得できる可能性もありますが、その場合も、言いにくいデータを知らなくても取得できます。これらのクエリについては、DBAに相談して、適切に記述され、要件に適切に一致していることを確認する必要があります。

于 2012-09-07T12:59:58.760 に答える
0

ExecuteReaderはリーダーのみを作成しますが、最初のレコードを取得するには$ data.Read()を呼び出す必要があります。(リンクされたMSDNのサンプルを参照してください)

于 2012-09-07T13:00:07.637 に答える