0

我正在使用 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
}

我收到一个错误:

警告:使用提供者上下文。服务器 = 本地主机。Invoke-Sqlcmd:无法打开登录请求的数据库“[Test_1]”。登录失败。用户 'WIN-MAINV98PDFA\admin' 登录失败。在 line:3 char:5 + Invoke-Sqlcmd -Database $Database -HostName WIN-MAINV98PDFA -Query "select 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

这似乎应该起作用。我错过了什么?

4

1 回答 1

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对象。

截屏

于 2014-08-21T15:42:01.437 回答