在Foreach循环中使用Invoke-SQL查询

时间:2017-12-08 14:19:30

标签: sql-server powershell

我有一个已导入

的实例列表

$ SQLServerList

我想让他们在每个实例上查找数据库。

foreach ($server in $SQLServerList ){
    Invoke-Sqlcmd -Query "use master select name, database_id, create_date, recovery_model_desc from sys.databases"  -ServerInstance $server
}

然而,这不会影响我做错了什么?

2 个答案:

答案 0 :(得分:0)

给定一个包含列'服务器'的CSV文件包含服务器名称,使用

$SQLServerList = import-csv servers.csv

文件上的

将返回带有NoteProperty 'Server'的对象。 (想象一下,csv有多个列,您需要一种方法来识别您正在访问哪一个,$SQLServerList对象将包含每列的属性。)

foreach ($server in $SQLServerList)中使用此内容时,$SQLServerList$server代表整个对象,在传递给invoke-sqlcmd时没有多大意义,所以{{ 1}}是必需的。

或者,$Server.Server返回一个字符串数组,应该可以直接在$SQLServerList = (import-csv servers.csv).Server

中使用

答案 1 :(得分:0)

使用以下内容可以更轻松地排除错误。查看计数是否与CSV文件中的计数相符。您还可以列出它以查看CSV的内容..并将正在使用的数据库从脚本内部更改为参数 - 数据库。

$inputfile = "C:\Databases\JUSTCREATED.csv"


[Array]$SQLServerList = get-content -Path $inputfile

$SQLServerList.count

foreach ($server in $SQLServerList ){


    Write-Output $server
    try{
    Invoke-Sqlcmd -Query " select name, database_id, create_date, recovery_model_desc from sys.databases"  -ServerInstance $server -Database master
        }
        catch 
        {

        Write-Output $_.Exception.Message


        }

}