首页 > 解决方案 > Powershell 连接字符串中的 MSSQl 'GO' 处理

问题描述

我有一个用 a 修补的 sql 查询Go来检查 mssql 中的孤立对象。

use DBName
go
sp_change_users_login 'report'

现在,我在 Powershell 中为所有用户数据库自动执行上述操作,并尝试获取孤儿用户。

这是代码:

        if($port)
        {
        $connectionString ="server=$servername,$port;Integrated Security=true;" #uid=$DBUserName; pwd=$dbpwd;Database=$DB;
        }
        else
        {
        $connectionString ="server=$servername;Integrated Security=true;" 
        }
        $connection = New-Object System.Data.SqlClient.SqlConnection -ea Stop
        $connection.ConnectionString=$connectionString
        $connection.Open()

        $db_query = @"
        Select name from sys.sysdatabases where dbid > 4 and name not in ('ReportServer')
"@
        $command = $connection.CreateCommand()
        $command.CommandText = $db_query
        $result = $command.ExecuteReader()
        $object= New-Object System.Data.DataTable
        $object.Load($result)
        [System.Array]$DBs = $object.name

        if($DBs -is [System.Array])
        {
            foreach($DB in $DBs)
            {
            ## PROBLEM IS HERE ###
              $orphan_users_query = @"

                use $DB
                GO
                sp_change_users_login 'report'

"@
        $command = $connection.CreateCommand()
        $command.CommandText = $orphan_users_query
        $result = $command.ExecuteReader()
        $object= New-Object System.Data.DataTable
        $object.Load($result)
        $object | Out-File C:\temp\outfile_property.txt -Append -Force
            }
        }

问题是 PS 无法识别go分隔符,因为它特定于 MSSQL/SSMS。那么,如何在不创建特定于每个数据库的多个连接的情况下仍然在所有用户数据库中迭代和运行查询?

标签: sql-serverpowershell

解决方案


调用ChangeDatabase连接是切换数据库的另一种方法。

然后,您可以sp_change_users_login按原样执行。不需要GO


推荐阅读