首页 > 解决方案 > 自动在 Powershell 上运行 SQL 查询

问题描述

我正在使用以下查询为多个 SQL Server 使用 powershell 脚本自动执行数据库计数、数据库名称、数据库创建日期:

#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')")

但是这个查询给出了以下错误:

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

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

标签: sql-serverpowershell

解决方案


罪魁祸首是这样的说法:

$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 计数。


推荐阅读