使用SSMS 18.4在Azure SQL无服务器池生成表脚本失败求助
尝试使用SSMS 18.4版本在Azure SQL无服务器池中生成表脚本,操作步骤:在对象资源管理器中右键目标表,依次选择「编写表脚本为」→「CREATE到」→「新查询编辑器窗口」。
但持续出现错误,弹窗提示内容为Invalid version: 16. (Microsoft.SqlServer.Smo),完整错误信息如下:
Invalid version: 16. (Microsoft.SqlServer.Smo)
如需帮助,请参考Microsoft官方相关支持文档
程序位置:
at Microsoft.SqlServer.Management.Smo.ScriptingOptions.ConvertToSqlServerVersion(Int32 majorVersion, Int32 minorVersion)
at Microsoft.SqlServer.Management.Smo.ScriptingOptions.ConvertToSqlServerVersion(ServerVersion serverVersion)
at Microsoft.SqlServer.Management.UserSettings.ScriptingOptions.GetSmoScriptingOptions(SqlSmoObject smoObj)
at Microsoft.SqlServer.Management.UI.VSIntegration.ObjectExplorer.ScriptNodeActionContext.Script(SqlTextWriter writer)
at Microsoft.SqlServer.Management.UI.VSIntegration.ObjectExplorer.SqlScriptMenu.OnScriptItemClick(Object sender, EventArgs e)
请问是否需要降级SSMS版本来解决该问题?
不需要降级SSMS,反而建议升级到SSMS 18.5或更高版本:
- 问题根源:SSMS 18.4依赖的SMO(SQL Server管理对象)版本为15,而Azure SQL无服务器池的版本标识为16,旧版SMO无法识别该版本号,导致脚本生成时抛出错误。
- SSMS 18.5及后续版本已更新SMO组件,添加了对版本16的支持,可正常为Azure SQL无服务器池生成表脚本。
若暂时无法升级,可使用T-SQL手动生成表结构脚本作为替代,示例如下(将YourTableName替换为目标表名):
SELECT 'CREATE TABLE ' + QUOTENAME(t.name) + ' (' + STRING_AGG( QUOTENAME(c.name) + ' ' + CASE WHEN tp.name IN ('varchar', 'nvarchar', 'char', 'nchar') THEN tp.name + '(' + CASE WHEN c.max_length = -1 THEN 'MAX' ELSE CAST(c.max_length AS VARCHAR) END + ')' WHEN tp.name IN ('decimal', 'numeric') THEN tp.name + '(' + CAST(c.precision AS VARCHAR) + ',' + CAST(c.scale AS VARCHAR) + ')' ELSE tp.name END + CASE WHEN c.is_nullable = 0 THEN ' NOT NULL' ELSE ' NULL' END, ', ' ) + ')' AS CreateTableScript FROM sys.tables t JOIN sys.columns c ON t.object_id = c.object_id JOIN sys.types tp ON c.system_type_id = tp.system_type_id AND c.user_type_id = tp.user_type_id WHERE t.name = 'YourTableName' GROUP BY t.name;
内容的提问来源于stack exchange,提问作者Patterson

