【问题标题】:Enumerate Databases Using SQL PowerShell使用 SQL PowerShell 枚举数据库
【发布时间】:2014-08-21 14:15:17
【问题描述】:

我正在使用 PowerShell 4.0 和 SQLPS 插件来处理 SQL Server。

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

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

[测试_1] [数据库管理员] [测试_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
}

我收到一个错误:

警告:使用提供者上下文。服务器 = 本地主机。调用-Sqlcmd : 无法打开登录请求的数据库“[Test_1]”。登录 失败的。用户 'WIN-MAINV98PDFA\admin' 登录失败。在线:3 字符: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

这似乎应该可行。我错过了什么?

【问题讨论】:

    标签: powershell sqlps


    【解决方案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 对象。

    【讨论】:

      猜你喜欢
      • 2012-02-06
      • 1970-01-01
      • 2014-07-05
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      • 1970-01-01
      • 2020-10-12
      • 1970-01-01
      相关资源
      最近更新 更多