• 全部
  • 基础类
  • 应用实例
  • 新技术前沿

如何用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中的每一个字段名都写出来,请问有什么办法?
...全文
114 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
-狙击手- 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]
回复
相关推荐
发帖
MS-SQL Server
创建于2007-09-28

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2008-04-09 11:59
社区公告
暂无公告