SQL Server 2019链接服务器表CREATE生成选项置灰,如何获取建表语句?
解决链接服务器表无法生成CREATE脚本的问题
方法一:通过系统视图手动拼接CREATE语句
直接查询链接服务器的系统元数据视图,获取表的列、约束等信息后手动拼接脚本:
- 查询列基础信息:
SELECT c.name AS column_name, t.name AS data_type, CASE WHEN t.name IN ('varchar', 'nvarchar', 'char', 'nchar') THEN CONCAT(t.name, '(', CASE c.max_length WHEN -1 THEN 'MAX' ELSE CAST(c.max_length AS VARCHAR) END, ')') WHEN t.name IN ('decimal', 'numeric') THEN CONCAT(t.name, '(', c.precision, ',', c.scale, ')') ELSE t.name END AS full_data_type, CASE WHEN c.is_nullable = 1 THEN 'NULL' ELSE 'NOT NULL' END AS nullable, ISNULL(CONCAT('DEFAULT ', dc.definition), '') AS default_constraint FROM [LinkedServerName].[RemoteDBName].sys.columns c JOIN [LinkedServerName].[RemoteDBName].sys.types t ON c.system_type_id = t.system_type_id AND c.user_type_id = t.user_type_id LEFT JOIN [LinkedServerName].[RemoteDBName].sys.default_constraints dc ON c.default_object_id = dc.object_id WHERE c.object_id = OBJECT_ID('[LinkedServerName].[RemoteDBName].[SchemaName].[TableName]') ORDER BY c.column_id;
- 查询主键约束:
SELECT CONCAT('PRIMARY KEY (', STRING_AGG(COL_NAME(c.object_id, c.column_id), ', '), ')') AS pk_constraint FROM [LinkedServerName].[RemoteDBName].sys.key_constraints k JOIN [LinkedServerName].[RemoteDBName].sys.index_columns ic ON k.parent_object_id = ic.object_id AND k.unique_index_id = ic.index_id JOIN [LinkedServerName].[RemoteDBName].sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id WHERE k.type = 'PK' AND k.parent_object_id = OBJECT_ID('[LinkedServerName].[RemoteDBName].[SchemaName].[TableName]');
将两次查询结果组合,即可得到完整的CREATE TABLE语句。
方法二:使用SSMS生成脚本向导
- 在SSMS中右键点击链接服务器下的目标数据库,选择「任务」→「生成脚本」。
- 在向导中选择需要生成脚本的特定表,进入「设置脚本选项」步骤,确保勾选「编写CREATE TABLE脚本」等相关选项。
- 按向导提示完成操作,即可导出选中表的CREATE脚本。
方法三:用PowerShell调用SMO生成脚本
借助SQL Server管理对象(SMO)自动生成脚本:
# 加载SMO程序集(路径对应SQL Server 2019的SDK位置) Add-Type -Path "C:\Program Files\Microsoft SQL Server\150\SDK\Assemblies\Microsoft.SqlServer.Smo.dll" # 连接远程服务器 $server = New-Object Microsoft.SqlServer.Management.Smo.Server "RemoteServerInstanceName" $database = $server.Databases["RemoteDBName"] $table = $database.Tables["TableName", "SchemaName"] # 配置脚本选项 $scriptOpts = New-Object Microsoft.SqlServer.Management.Smo.ScriptingOptions $scriptOpts.ScriptSchema = $true $scriptOpts.ScriptData = $false # 不需要表数据则保持false # 生成并保存脚本 $scriptContent = $table.Script($scriptOpts) $scriptContent | Out-File "D:\Scripts\Create_Table.sql"
注意:需确保本地安装了SQL Server 2019 SDK,且远程服务器允许SMO访问。
关于CREATE To选项灰色的原因
SSMS右键菜单的Script Table As->CREATE To功能仅对本地服务器表提供完善支持,针对链接服务器的表,由于元数据获取权限限制或功能设计局限,该选项会处于不可用状态。
内容的提问来源于stack exchange,提问作者Brian Karabinchak
相关产品推荐
相关产品推荐

