使用SQL PowerShell枚举数据库

时间:2014-08-21 14:15:18

标签: powershell sqlps

我使用PowerShell 4.0和SQLPS插件来使用SQL Server。

ForEach($Database in (Get-ChildItem -FORCE SQLSERVER:\SQL\localhost\DEFAULT\Databases))
{
    Write-Host $Database
}

这将输出我在本地拥有的数据库列表,例如:

  

[TEST_1]   [DBA]   [Test_2]

但是,如果我尝试使用$ Database(

)做某事
ForEach($Database in (Get-ChildItem -FORCE SQLSERVER:\SQL\localhost\DEFAULT\Databases))
{
    Invoke-Sqlcmd -Database $Database -HostName WIN-MAINV98PDFA -Query "select db_name()" -ServerInstance LocalHost
}

我收到错误:

  

警告:使用提供程序上下文。 Server = localhost。 Invoke-Sqlcmd:   无法打开数据库" [Test_1]"登录请求。登录   失败。用户' WIN-MAINV98PDFA \ admin'登录失败。在线:3   焦炭:5   + Invoke-Sqlcmd -Database $ Database -HostName WIN-MAINV98PDFA -Query"选择d ...   + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~       + CategoryInfo:InvalidOperation:(:) [Invoke-Sqlcmd],SqlException       + FullyQualifiedErrorId:SqlExectionError,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand

我认为问题归结为 - 括号之间的区别。

使用:

Invoke-Sqlcmd -Database Test_1 -HostName WIN-MAINV98PDFA -Query "select db_name()" -ServerInstance LocalHost

失败:

Invoke-Sqlcmd -Database [Test_1] -HostName WIN-MAINV98PDFA -Query "select db_name()" -ServerInstance LocalHost

这似乎应该有效。我错过了什么?

1 个答案:

答案 0 :(得分:1)

存储在$Database变量中的对象可能是一个复杂类型,并且包含的​​信息不仅仅是数据库的名称。运行此命令,以查看是否存在包含数据库名称的属性,但不包含方括号:

$Database | Select-Object -Property *;

假设存在类似Name属性的内容,则通过引用该属性来传入数据库的名称。

ForEach($Database in (Get-ChildItem -FORCE SQLSERVER:\SQL\localhost\DEFAULT\Databases))
{
    Invoke-Sqlcmd -Database $Database.Name -HostName WIN-MAINV98PDFA -Query "select db_name()" -ServerInstance LocalHost
}

以下是使用Windows服务而不是Database对象的示例。

Screenshot