PowerShell导入SQLServer模块失败及SQLSERVER驱动器找不到求助
你碰到的问题核心在于SQLServer模块默认尝试加载的旧版本(9.0.242.0)程序集,和你系统中SQL Server 2017对应的140版本组件不匹配,再加上x64与x86程序集路径的混淆,导致模块初始化失败。另外那个用SqlConnection的脚本能“修复”后续导入,是因为它运行时自动加载了正确版本的SQL Server相关程序集,模块后续可以复用这些已加载的程序集,所以不会再报错。
下面是具体的解决步骤:
1. 确保运行x64版本的PowerShell
你的SQL Server是x64版本,一定要启动x64的PowerShell(默认PowerShell可能是x86,尤其是在装有32位软件的机器上)。x64的PowerShell会优先查找C:\Program Files下的x64程序集,而非Program Files (x86)里的32位版本,能直接避免路径混淆问题。
2. 手动加载正确版本的程序集
在导入SQLServer模块之前,先手动加载你系统中存在的正确版本程序集,示例如下:
# 加载ConnectionInfo(根据你找到的路径调整) Add-Type -Path "C:\Program Files (x86)\Microsoft SQL Server\120\SDK\Assemblies\Microsoft.SqlServer.ConnectionInfo.dll" # 加载Smo(140版本的x64路径) Add-Type -Path "C:\Program Files\Microsoft SQL Server\140\SDK\Assemblies\Microsoft.SqlServer.Smo.dll" # 再导入模块 Import-Module SQLServer
这样模块会复用你已加载的正确版本程序集,不会再尝试寻找旧版的9.0.242.0。
3. 修改SQLServer模块的加载逻辑(彻底解决)
如果每次手动加载太麻烦,可以修改模块的SQLServer.psm1文件(路径为C:\Users\Student\Documents\WindowsPowerShell\Modules\sqlserver\SQLServer.psm1):
- 找到包含
add-type -AssemblyName "Microsoft.SqlServer.ConnectionInfo"和add-type -AssemblyName "Microsoft.SqlServer.Smo"的代码块 - 将它们替换为指定完整DLL路径的形式,比如:
# 替换原catch块中的ConnectionInfo加载代码 catch {Add-Type -Path "C:\Program Files\Microsoft SQL Server\140\SDK\Assemblies\Microsoft.SqlServer.ConnectionInfo.dll"} # 替换原catch块中的Smo加载代码 catch {Add-Type -Path "C:\Program Files\Microsoft SQL Server\140\SDK\Assemblies\Microsoft.SqlServer.Smo.dll"; $smoVersion ...}
修改后模块启动时会直接加载你指定的正确版本程序集,不会再报错。
4. 确认SMO组件完整安装
SQL Server 2017的SMO组件可能未完整安装,你可以通过以下方式补全:
- 运行SQL Server安装程序,选择“添加功能”,确保勾选“SQL Server管理工具 - 完整”选项
- 如果你通过NuGet安装了
Microsoft.SqlServer.SqlManagementObjects,可以将其安装路径(比如C:\Users\Student\.nuget\packages\microsoft.sqlserver.sqlmanagementobjects\对应版本号\lib\net46)添加到PowerShell的$env:PATH中,让模块能自动找到这些程序集。
关于你提到的“缺少ConnectionInfo是否会导致Smo加载失败”:是的,Smo组件依赖ConnectionInfo程序集,所以ConnectionInfo加载失败时,Smo也会跟着加载失败,这就是你看到前两个FileNotFoundException的原因。
内容的提问来源于stack exchange,提问作者Matthew Kovalenko

