SELECT INTO 是 SQL Server 中复制表结构和数据最轻量、兼容性最好的方式,仅需目标表不存在,支持 Navicat 正常识别与编辑,但不复制主键、索引、约束等对象。
SQL Server 用 SELECT INTO 复制表结构和数据最直接
想在 sql server 里快速复制一张表(含结构+数据),又希望 navicat 能正常识别、后续能编辑,select into 是最轻量、兼容性最好的方式。它不依赖 gui 工具逻辑,纯 t-sql,navicat 执行后新建的表和原表一样可读写、有列类型、有非空约束(但不带主键/索引/默认值等对象)。
常见错误是误用 CREATE TABLE ... AS SELECT —— 这是 PostgreSQL/Oracle 语法,SQL Server 不支持,会报错 Incorrect syntax near 'AS'。
-
SELECT INTO必须目标表不存在,不能覆盖已有表 - 只复制源表的列定义(类型、是否允许 NULL)、数据,不复制主键、外键、索引、约束、默认值、计算列、标识属性(除非显式用
IDENTITY()函数) - 如果源表有
IDENTITY列,目标表默认不会继承该属性;需用IDENTITY(int,1,1)显式声明才能保留自增行为 - 示例:
SELECT * INTO dbo.NewTable FROM dbo.OldTable;
Navicat 中执行失败?检查当前数据库上下文和权限
在 Navicat 里右键执行 SQL 时提示 Invalid object name 或 permission denied,大概率不是语法问题,而是连接上下文或权限卡住。
- Navicat 默认可能连在
master或其他库,而你的表在MyDB,必须显式指定:用USE MyDB;切库,或写全三段名MyDB.dbo.OldTable -
SELECT INTO需要目标数据库的db_owner或至少db_ddladmin+INSERT权限;普通db_datareader不够 - 如果 Navicat 提示“无法创建新表”,可能是当前用户对
dboschema 没有CREATE TABLE权限,换 schema(如SELECT INTO myuser.NewTable...)或联系 DBA 授权
需要连主键/索引一起复制?别用 SELECT INTO,改用 GENERATE SCRIPTS
SELECT INTO 省事但功能有限。如果你明确要保留主键、聚集索引、外键或默认约束,SQL Server Management Studio(SSMS)的生成脚本功能更可靠,Navicat 也能调用它导出的 SQL。
- SSMS 右键原表 →
Tasks→Generate Scripts...→ 选中“Script Indexes”“Script Primary Keys”等选项 → 输出为单个CREATE TABLE + ALTER脚本 - 注意:生成的脚本默认不含数据;勾选“Types of data to script”为
Data only或Schema and Data才能带数据(后者会用INSERT INTO ... VALUES,大数据量极慢) - 若数据量大(百万级以上),建议先用
SELECT INTO拉结构+数据,再手动补建索引——比脚本插入快一个数量级
复制后 Navicat 刷新看不到新表?强制重载对象列表
执行完 SELECT INTO 后,在 Navicat 左侧对象浏览器里刷新(F5)仍不见新表,不是没成功,是 Navicat 缓存了元数据视图。
- 右键数据库节点 →
Refresh(不是表节点);或者关闭再重连该连接 - 确认是否在正确 schema 下查看:新表默认建在当前用户默认 schema(通常是
dbo),但如果你登录用户绑定了myuserschema,且没权限查dbo,就看不见 - 临时验证是否存在:执行
SELECT * FROM sys.tables WHERE name = 'NewTable';,有结果就说明表已建好,只是 Navicat 没刷出来
真正容易被忽略的是 schema 绑定和权限隔离——同一个数据库下,不同用户看到的“同名表”可能根本不是一张表,尤其在启用了 row-level security 或 schema-per-user 的生产环境。










