Powershell - SQL Server - 用于多个实例的循环中的connectionstring

时间:2015-07-13 07:04:43

标签: sql sql-server tsql powershell

这是一个更大的脚本的一部分,它在SQL Server机器上找到 DatabaseFiles (多个实例)。

以下应该只返回3个实例的所有文件。

服务器名为V3000801,其中有一个默认实例+2个命名实例。如果默认或命名不起作用我也可以,我将单独解决这个问题(最有可能创建一个标志,并使用另一个连接字符串默认)。

$SqlCmd.ExecuteNonQuery()只返回-1,这对我没有任何意义。

感谢您的帮助

for($i=0;$i -lt $instances.Length;$i++){
  $SqlConnection = New-Object System.Data.SqlClient.SqlConnection;
  $Server= "V3000801\"+$instances[$i];
  $SqlConnection.ConnectionString = "Server = $server ; Database = master; Integrated Security = sspi;trusted_connection=true";
  $sqlQuery="SELECT physical_name FROM sys.master_files;";

  Write-Host $SqlConnection.ConnectionString;

  $SqlConnection.Open();
  $SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
  $SqlCmd.CommandText = $sqlQuery;
  $SqlCmd.Connection = $SqlConnection;
  $SqlCmd.ExecuteNonQuery();
  $SqlConnection.Close();
}

2 个答案:

答案 0 :(得分:0)

使用ExecuteReader功能进行选择。 ExecuteNonQuery用于不返回任何结果(例如插入,更新和删除)的操作。

Here是.NET中的一个示例,但它在PowerShell中应该类似。

编辑:

此代码应该有效。我在自己的环境中尝试了它(使用不同的服务器名称)。

for($i=0;$i -lt $instances.Length;$i++){
  $SqlConnection = New-Object System.Data.SqlClient.SqlConnection;
  $Server= "V3000801\"+$instances[$i];
  $SqlConnection.ConnectionString = "Server = $server ; Database = master; Integrated Security = sspi;trusted_connection=true";
  $sqlQuery="SELECT physical_name FROM sys.master_files;";

  Write-Host $SqlConnection.ConnectionString;

  $SqlConnection.Open();
  $SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
  $SqlCmd.CommandText = $sqlQuery;
  $SqlCmd.Connection = $SqlConnection;
  $reader = $SqlCmd.ExecuteReader();
          while ($reader.Read())
        {
           "pfad=" $reader["physical_name"];
        };
  $SqlConnection.Close();

}

答案 1 :(得分:0)

@jody发布的链接包含一些很好的信息 尝试:

$dr= $SqlCmd.ExecuteReader()
 while ($dr.Read())
{
  $dr.GetValue(0)
}
$sqlconnection.Close()