如何用SQL语句实现不指定列名的插入

头发依旧浓密 2008-04-09 11:59:22
有A和B两个表,这两个表的结构都一样,其中有一个自增的ID字段。
我写过一个语句
INSERT INTO A
SELECT * FROM B WHERE B.A='VV'
但提示“仅当使用了列的列表,并且 IDENTITY_INSERT 为 ON 时,才能在表 'A' 中为标识列指定显式值。”
我不想把A中的每一个字段名都写出来,请问有什么办法?
...全文
272 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
-狙击手- 2008-04-09
  • 打赏
  • 举报
回复
create table ta(id int identity(1,1),a varchar(10),col1 int,col2 int)
create table tb(id int identity(1,1),a varchar(10),col1 int,col2 int)

go
insert into ta select 'w',1,2
insert into ta select 'w',1,2
insert into ta select 'w',1,2
insert into ta select 'w',1,2
insert into ta select 'w',1,2
insert into ta select 'w',1,2

declare @s varchar(2000)

select @s = isnull(@s+',','')+a.name
from syscolumns a
where id = object_id('ta')
and COLUMNPROPERTY( a.id,a.name,'IsIdentity') <> 1
order by colid
exec('insert tb select '+ @s+ ' from ta where a = ''w''')
select * from tb
/*

id a col1 col2
----------- ---------- ----------- -----------
1 w 1 2
2 w 1 2
3 w 1 2
4 w 1 2
5 w 1 2
6 w 1 2

(所影响的行数为 6 行)
*/
drop table ta,tb
  • 打赏
  • 举报
回复
SET IDENTITY_INSERT ON
INSERT INTO A
SELECT * FROM B WHERE B.A='VV'
SET IDENTITY_INSERT OFF
-狙击手- 2008-04-09
  • 打赏
  • 举报
回复
这样处理可能还会有问题,关键是ID能不能重复?
liangCK 2008-04-09
  • 打赏
  • 举报
回复
--1. 会话中某个表已将此属性设置为ON,当为另一个表发出了SET IDENTITY_INSERT ON 句时将出错
--测试的表
CREATE TABLE ta(id int IDENTITY(1,1),col int)
CREATE TABLE tb(id int IDENTITY(1,1),col int)
GO

--设置 IDENTITY_INSERT 属性
SET IDENTITY_INSERT ta ON
SET IDENTITY_INSERT tb ON
GO


/*======================================================*/


--2. 如果插入记录的标识值大于表的当前标识值,则SQL Server自动将新插入值作为当前标识值使用
--测试的表
CREATE TABLE tb(id int IDENTITY(1,1),col int)

--强制在表中插入标识值
SET IDENTITY_INSERT tb ON
INSERT tb(id,col) VALUES(10,1)
SET IDENTITY_INSERT tb OFF

INSERT tb(col) VALUES(2)
SELECT * FROM tb
/*--结果
id col
----------------- -----------
10 1
11 2
--*/
GO


/*======================================================*/


--3. 如果插入记录的标识值小于表的当前标识值,则表的当前标识值不受新插入值的影响
--测试的表
CREATE TABLE tb(id int IDENTITY(1,1),col int)
INSERT tb VALUES(1)
INSERT tb VALUES(2)

--强制在表中插入标识值
SET IDENTITY_INSERT tb ON
INSERT tb(id,col) VALUES(1,11)
SET IDENTITY_INSERT tb OFF

INSERT tb(col) VALUES(3)
SELECT * FROM tb
/*--结果
id col
----------------- -----------
1 1
2 2
1 11
3 3
--*/
zhuyx808 2008-04-09
  • 打赏
  • 举报
回复
^.^
JL99000 2008-04-09
  • 打赏
  • 举报
回复
我也建议写列名,何必难为自己呢

flairsky 2008-04-09
  • 打赏
  • 举报
回复
这样做不怎么好,不利于以后的维护和修改

如果你不改标示,那就要写列名,如果你改标示,就可以直接插入

我还是建议你写列名。
viva369 2008-04-09
  • 打赏
  • 举报
回复
IDENTITY_INSERT 必须要指定列明,

删除自增插入后再添加~
正宗老冉 2008-04-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 happyflystone 的回复:]
这样处理可能还会有问题,关键是ID能不能重复?
[/Quote]

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧