加载Microsoft.SqlServer.Smo失败相关问题求助
问题描述
执行以下PowerShell命令时出现错误:
Add-Type –AssemblyName “Microsoft.SqlServer.Smo, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91”
错误信息:
Add-Type: C:\src\sql\sql-objects-001.ps1:1 Line | 1 | Add-Type -AssemblyName “Microsoft.SqlServer.Smo, Version=12.0.0.0, Cu … | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | Cannot find path 'C:\src\sql\Microsoft.SqlServer.Smo.dll' because it does not exist.
疑问:
- Add-Type 是否始终需要绝对路径?
- 系统中存在多个
Microsoft.SqlServer.Smo.dll文件,是否需要匹配对应SQL Server版本(2016、2019、2022)才能正常访问?
系统中找到的所有Microsoft.SqlServer.Smo.dll路径:
PS C:\> (Get-ChildItem -Recurse -File -Filter 'Microsoft.SqlServer.Smo.dll' -ErrorAction SilentlyContinue).FullName C:\Program Files\Azure Data Studio\resources\app\extensions\mssql\sqltoolsservice\Windows\4.4.1.5\Microsoft.SqlServer.Smo.dll C:\Program Files\WindowsPowerShell\Modules\SqlServer\21.1.18226\Microsoft.SqlServer.Smo.dll C:\Program Files\WindowsPowerShell\Modules\SqlServer\21.1.18226\coreclr\Microsoft.SqlServer.Smo.dll C:\Program Files (x86)\Microsoft SQL Server\120\SDK\Assemblies\Microsoft.SqlServer.Smo.dll C:\Program Files (x86)\Microsoft SQL Server Management Studio 19\Common7\IDE\Microsoft.SqlServer.Smo.dll C:\Program Files (x86)\Microsoft SQL Server Management Studio 19\Common7\IDE\CommonExtensions\Microsoft\SSIS\160\Binn\150References\SMO\Microsoft.SqlServer.Smo.DLL C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\CommonExtensions\Microsoft\SSAS\Microsoft.SqlServer.Smo.dll C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\Extensions\Microsoft\SQLCommon\130\Microsoft.SqlServer.Smo.dll C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\Extensions\Microsoft\SQLCommon\140\Microsoft.SqlServer.Smo.dll C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\Extensions\Microsoft\SQLCommon\150\Microsoft.SqlServer.Smo.dll C:\src\dbatools\bin\smo\Microsoft.SqlServer.Smo.dll C:\src\dbatools\bin\smo\coreclr\Microsoft.SqlServer.Smo.dll C:\Users\lit\.nuget\packages\microsoft.sqlserver.sqlmanagementobjects\150.18118.0\lib\net45\Microsoft.SqlServer.Smo.dll C:\Users\lit\.nuget\packages\microsoft.sqlserver.sqlmanagementobjects\150.18118.0\lib\netstandard2.0\Microsoft.SqlServer.Smo.dll C:\Users\lit\.vscode\extensions\ms-mssql.mssql-1.18.0\sqltoolsservice\4.5.1.6\Windows\Microsoft.SqlServer.Smo.dll C:\Users\lit\OneDrive\Documents\PowerShell\Modules\dbatools\1.1.95\bin\smo\Microsoft.SqlServer.Smo.dll C:\Users\lit\OneDrive\Documents\PowerShell\Modules\dbatools\1.1.95\bin\smo\coreclr\Microsoft.SqlServer.Smo.dll C:\Users\lit\OneDrive\Documents\PowerShell\Modules\SqlServer\21.1.18256\Microsoft.SqlServer.Smo.dll C:\Users\lit\OneDrive\Documents\PowerShell\Modules\SqlServer\21.1.18256\coreclr\Microsoft.SqlServer.Smo.dll C:\Users\lit\OneDrive\Documents\WindowsPowerShell\Modules\dbatools\1.0.113\bin\smo\Microsoft.SqlServer.Smo.dll C:\Users\lit\OneDrive\Documents\WindowsPowerShell\Modules\dbatools\1.0.113\bin\smo\coreclr\Microsoft.SqlServer.Smo.dll C:\Users\lit\OneDrive\Documents\WindowsPowerShell\Modules\SqlServer\21.1.18218\Microsoft.SqlServer.Smo.dll C:\Users\lit\OneDrive\Documents\WindowsPowerShell\Modules\SqlServer\21.1.18218\coreclr\Microsoft.SqlServer.Smo.dll C:\Users\lit\OneDrive\Documents\WindowsPowerShell\Modules\SqlServer\21.1.18245\Microsoft.SqlServer.Smo.dll C:\Users\lit\OneDrive\Documents\WindowsPowerShell\Modules\SqlServer\21.1.18245\coreclr\Microsoft.SqlServer.Smo.dll C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.Smo\11.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Smo.dll C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.Smo\12.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Smo.dll C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.Smo\13.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Smo.dll
解答
1. Add-Type 不需要始终使用绝对路径
你遇到的错误本质是命令里用了中文全角引号,PowerShell无法正确解析程序集名称,误把它当成了本地文件路径。换成英文半角引号就能解决:
Add-Type –AssemblyName "Microsoft.SqlServer.Smo, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"
正常情况下,Add-Type -AssemblyName会自动从全局程序集缓存(GAC)、PowerShell模块路径或系统默认搜索目录里找指定程序集,完全不用手动写绝对路径。
如果是要直接加载本地某个特定DLL,才需要用绝对或相对路径,比如:
Add-Type -Path "C:\Program Files (x86)\Microsoft SQL Server\120\SDK\Assemblies\Microsoft.SqlServer.Smo.dll"
2. SMO版本与SQL Server版本的匹配逻辑
SMO(SQL Server管理对象)和SQL Server实例版本是兼容而非严格绑定的:
- 高版本SMO兼容低版本实例:比如用SMO 15.0(对应SQL Server 2019)可以管理2016、2019、2022所有版本的实例。
- 低版本SMO无法管理高版本实例:比如SMO 12.0(对应SQL Server 2014)处理不了2019/2022的新特性,会报错。
从你的路径能看到,GAC里已经有12.0版本的SMO,但如果要管理2016及以上的SQL Server,建议用更高版本的SMO(比如13.0/15.0/16.0)。
更省心的替代方案
直接装官方的SqlServer PowerShell模块,它会自动加载适配的SMO版本,不用手动调用Add-Type:
Install-Module -Name SqlServer -Force -AllowClobber Import-Module SqlServer
或者用dbatools模块,它封装了SMO的所有功能,操作更简单,还自动处理版本兼容问题:
Install-Module -Name dbatools -Force -AllowClobber Import-Module dbatools
内容的提问来源于stack exchange,提问作者lit
相关产品推荐
相关产品推荐

