SQL Server 不支持 SCHEMA_ONLY 参数实现表结构复制;真正可行的方法是手动生成完整 DDL(如 SSMS 脚本向导)或使用第三方工具,SELECT * INTO ... WHERE 1=0 等方式仅保留基本列定义,丢失主键、索引、约束等全部对象。

直接用 BULK INSERT 或 bcp 加 SCHEMA_ONLY 参数无法实现表结构复制 —— 这个参数根本不存在。 SQL Server 没有原生支持 SCHEMA_ONLY 的表克隆语法,所有声称“SELECT * INTO ... WITH (SCHEMA_ONLY)”或类似写法的方案,要么是混淆了 Azure Synapse 的 COPY INTO 语法,要么是误传。
SQL Server 中真正可用的结构复制方法
要只复制表结构(含约束、索引、默认值等),必须分场景选择合适手段,不能依赖不存在的开关:
-
CREATE TABLE ... LIKE是 MySQL 语法,在 SQL Server 中会报错Incorrect syntax near 'LIKE' -
SELECT * INTO new_table FROM old_table WHERE 1=0只能复制列定义和NOT NULL属性,丢失主键、外键、索引、计算列、默认约束、触发器、权限等 - SSMS 右键 → “编写表脚本为” → “CREATE 到” 是最稳妥的手动方式,生成完整 DDL,但需人工替换表名并检查依赖(如引用的用户定义类型、架构)
- 使用
sys.dm_exec_describe_first_result_set或第三方工具(如 Redgate SQL Compare)可自动化提取结构,但需额外部署
为什么不能在复制过程中禁用数据插入?
有人尝试在 bcp 导出时加 -n(本机格式)或 -c(字符格式)再配合空文件导入,指望“没数据就等于只建结构”——这行不通:
-
bcp out输出的是数据,不是 DDL;bcp in要求目标表已存在,不会自动建表 - 即使先用
SELECT * INTO建空表,再用BULK INSERT ... WITH (TABLOCK, ROWS_PER_BATCH = 0),也仍属于“建表 + 批量导入”,且ROWS_PER_BATCH = 0并不跳过数据,只是让 SQL Server 自行估算批次大小 - XML 格式化文件(
bcp -f)能描述列映射,但依然不生成建表语句,它只服务于已有表的批量操作
合并复制或事务复制中结构变更的陷阱
如果你正处在复制拓扑中,想靠“改发布表结构来同步新建空表”,要注意:
- ALTER TABLE、ALTER PROCEDURE 等 DDL 默认会传播到订阅端,但仅限于**已发布的对象**;你不能靠它凭空创建一个未发布的表
- 新增一张表必须先通过
sp_addarticle显式添加为发布项目,否则哪怕你在发布库执行了CREATE TABLE,也不会出现在快照里 - 如果启用了
@replicate_ddl = 1,后续对这张表的ADD COLUMN会传播,但初始建表动作本身不会被复制 - 在订阅端手动建同名空表后启用
ADD ARTICLE,可能因架构不一致导致初始化失败(例如主键顺序、排序规则差异)
真正“只导结构”的边界很清晰:SQL Server 不提供一键命令。你必须接受要么手写/生成 DDL,要么用工具辅助——而任何绕开 DDL 的“空数据导入”思路,最终都会在约束、索引或权限环节掉链子。










