$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“。”
答案 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]
,但是如果提供商实际上并不是这个版本,那么这显然会中断。