使用Powershell从SQL Server 2008获取数据

时间:2012-01-04 10:16:15

标签: sql-server powershell

我在使用SQL Server中的简单存储过程中获取数据时遇到了一些困难。我有一个Powershell脚本需要从3列填充变量(该过程只返回1行)

这就是我所拥有的不起作用的东西。不知怎的,我没有正确引用列值。我尝试了各种方法,但通常会收到错误“无法索引到空数组”。我不想遍历结果集,我只是想直接从返回变量的一行中设置一些值

$conn = new-object Microsoft.SqlServer.Management.Common.ServerConnection
$conn.ConnectionString = `
  "Server=ServerName;Database=ShopDB;Integrated Security=True"
$sqlQuery = new-object System.Collections.Specialized.StringCollection
$sqlQuery.Add("JobSettingsGet")
$Resultset = $conn.ExecuteWithResults($sqlQuery)

# $UserName = $table.Rows(0).Columns(0) 
  # error - Method invocation failed because [System.Data.DataTable] doesn't 
  # contain a method named 'Rows'.
# $UserName = $table.Rows[0].Columns[0] 
  # error - cannot index null array
# $UserName = $table.Row(0).Column(0) 
  # error - Cannot index into a null array,  also Method invocation failed 
  # because [System.Data.DataTable] doesn't contain a method named 'Row'.
# $UserName = $table.Rows[0].Columns[1].Value 
  # error - cannot index null array

如果可能,我也想使用列名。

任何指针?

感谢, 西尔维亚

1 个答案:

答案 0 :(得分:6)

您可以使用System.Data.SqlClient.SqlConnection代替SqlServer.Management

$conn = New-Object Data.Sqlclient.Sqlconnection`
    ("Data Source=DATABASE;Initial Catalog=master;Integrated Security=SSPI;")
$adapter = New-Object Data.Sqlclient.Sqldataadapter("exec sp_who2", $conn)
$set = new-object data.dataset
$adapter.fill($set)
$table = new-object data.datatable
$table = $set.tables[0]

要打印整个表格,只需使用format-table

即可
$table | ft -AutoSize

要按名称获取列,请使用foreach迭代器并按名称访问注释属性

$table | % {$_.login}

Ed:这是使用SqlServer.Management的相同查询。

[void][Reflection.Assembly]::LoadWithPartialName`
   ("Microsoft.SqlServer.ConnectionInfo")
$conn = new-object Microsoft.SqlServer.Management.Common.ServerConnection
$conn.ConnectionString = `
   "Server=ServerName;Database=ShopDB;Integrated Security=True"
$sqlQuery = new-object System.Collections.Specialized.StringCollection 
$sqlQuery.Add("exec sp_who2") 
$resultset = $conn.ExecuteWithResults($sqlQuery)

通过选择零结果集,零表,零行和项目名称

来访问结果
$resultset[0].tables.Item(0).Rows[0].Item("Login")