无法使用PowerShell在SQL Server中创建数据库

时间:2016-10-10 12:32:04

标签: sql-server powershell

$primaryReplica = $configFile.Config.PrimaryReplica
$Database = $configFile.Config.DatabaseName
$SqlServer = $configFile.Config.ServerName

$machineName = gc env:computername

if ($machineName -eq $primaryReplica)
{
    Import-Module "sqlps" -DisableNameChecking

    cd "SQLSERVER:\SQL\$SqlServer\Default\Databases"
    $DatabaseInstance = Get-Item "$Database" -ErrorAction SilentlyContinue
    if ($DatabaseInstance -eq $null)
    {
        # Create DB
        $DatabaseInstance = New-Object Microsoft.SqlServer.Management.SMO.Database
        $DatabaseInstance.Parent = Get-Item "SQLSERVER:\SQL\$SqlServer\Default"
        $DatabaseInstance.Name = $Database
        $DatabaseInstance.RecoveryModel = "Full"
        $DatabaseInstance.Create()
    }

我希望使用PowerShell脚本在SQL Server中创建数据库。 上面的代码生成以下错误:

  

异常设置“Parent”:“无法将”Microsoft.SqlServer.Management.Smo.Server“类型的”[PAAROR]“值转换为”Microsoft.SqlServer.Management.Smo.Server“。”

2 个答案:

答案 0 :(得分:0)

要隔离问题,首先要验证Server对象是否可以使用$primaryReplica = $configFile.Config.PrimaryReplica $Database = $configFile.Config.DatabaseName $SqlServer = $configFile.Config.ServerName ... if ($DatabaseInstance -eq $null) { # Create DB $SqlServerInstance = New-Object Microsoft.SqlServer.Management.SMO.Server $SqlServer $DatabaseInstance = New-Object Microsoft.SqlServer.SMO.Database($SqlServerInstance, $Database) $DatabaseInstance.Create() } 实例名称进行实例化。然后继续创建数据库:

{{1}}

答案 1 :(得分:0)

这是因为您从不同的程序集中获得了冲突类型。这是我在我的系统上看到的内容:

> (get-item "SQLSERVER:\SQL\$server").GetType().Assembly.Location
  

C:\ Windows \组件\ GAC_MSIL \ Microsoft.SqlServer.Smo \ 12.0.0.0__89845dcd8080cc91 \ Microsoft.SqlServer.Smo.dll

> [Microsoft.SqlServer.Management.Smo.Server].Assembly.Location
  

C:\ Windows \组件\ GAC_MSIL \ Microsoft.SqlServer.Smo \ 13.0.0.0__89845dcd8080cc91 \ Microsoft.SqlServer.Smo.dll

sqlps从SQL Server 2014给我类型,但直接解析类型是从SQL Server 2016给我类型。这是因为导入sqlps时都加载了两个类型,这是...不幸的。

如果您从SQL Server 2016开始使用新模块,则应该导入SqlServer(然后您也可以省略-DisableNameChecking)。如果您必须使用sqlps向后兼容,我不确定正确的解决方案是什么。作为一个令人难以置信的丑陋的解决方法,您可以明确地将类型名称指定为[Microsoft.SqlServer.Management.Smo.Database, Microsoft.SqlServer.Smo, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91],但是如果提供商实际上并不是这个版本,那么这显然会中断。