我正在使用Powershell脚本针对多个SQL Server使用以下查询自动执行数据库计数,数据库名称,数据库创建日期:
#load the assembly
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO")
#read server names from a file
$servers = get-content "D:\dbcount\servers.txt"
$servers | $db = $server.Databases["master"]
$db.ExecuteWithResults("SELECT COUNT(*) OVER (PARTITION BY 1) AS db_count ,
name AS db_name , create_date AS db_creation_date FROM sys.databases WHERE
[name] NOT IN ('master', 'tempdb', 'model', 'msdb')")
但是此查询给出以下错误:
仅允许将表达式作为管道的第一个元素。
任何人都可以在这方面帮助我解决错误。.
答案 0 :(得分:0)
罪魁祸首是这句话:
$servers | $db = $server.Databases["master"]
这里发生的是将$servers
集合(字符串数组)通过管道传递给赋值语句$db = $server.Databases["master"]
,这对Powershell的解析规则没有任何意义,因此没有错误。
我冒昧地猜测您正在尝试像这样遍历$servers
,
$servers | % {
$server = New-Object Microsoft.SqlServer.Management.Smo.Server
$server.ConnectionContext.ConnectionString = "data source = $_,..."
$db = $server.Databases["master"]
...
}
此外,TSQL查询似乎也很特殊,因为除了数据库名称和创建日期外,每行上重复的数据库ID数量也是如此。