在Powershell上自动运行SQL查询

时间:2018-07-12 09:47:07

标签: sql-server powershell

我正在使用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')")

但是此查询给出以下错误:

仅允许将表达式作为管道的第一个元素。

任何人都可以在这方面帮助我解决错误。.

1 个答案:

答案 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数量也是如此。