我使用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
这似乎应该有效。我错过了什么?
答案 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
对象的示例。