复制具有特殊条件的行

时间:2012-03-20 11:17:14

标签: sql sql-server

我有一张包含很多列的表格。例如,我有一个包含这些列的表:

ID,Fname,Lname,Tel,Mob,Email,Job,Code,Company,......

ID列是自动编号列。我想将此表中的所有行复制到此表,并在此复制的行中将company列值更改为12。我不想写所有列的名称,因为我有很多列有很多列。

我试过这段代码,但是我遇到了这个错误:

declare @c int;
declare @i int;

select * into CmDet from CmDet;
select @C= count(id) from CmDet;

while @i < @C
begin
UPDATE CmDet
SET company =12
WHERE company=11
set @i += 1
end

错误:

  

Msg 2714,Level 16,State 6,Line 3
  数据库中已经有一个名为“CmDet”的对象。

我将代码更改为此

declare @c int
declare @i int
insert into CmDet select * from CmDet;
select @C= count(id) from CmDet;
while @i < @C
begin
UPDATE CmDet
SET company =12
WHERE company=11
set @i += 1
end

我有这个错误:

  

消息8101,级别16,状态1,行3显式的值   表'CmDet'中的标识列只能在列中指定   使用list并且IDENTITY_INSERT为ON。

我该怎么办?


我写这段代码:

drop table temp2;
declare @c bigint ;
select @C= count(id) from CmDet2;
SELECT * 
INTO temp2
FROM CmDet2;
ALTER TABLE temp2
     drop column ID;
update temp2 set company='12';
SET IDENTITY_INSERT dbo.CmDet2 ON
insert into CmDet2 select * from temp2;
SET IDENTITY_INSERT dbo.CmDet2 OFF;

但我还有这个错误:

Msg 545,Level 16,State 1,Line 11 当IDENTITY_INSERT设置为ON或复制用户插入NOT FOR REPLICATION标识列时,必须为表'CmDet2'中的标识列指定显式值。

2 个答案:

答案 0 :(得分:0)

您正在尝试插入已存在的表中。我建议,删除CmDet表,然后重新运行第一个查询(如果表的目的是存储临时数据)。或者,您可以使用:

SET IDENTITY_INSERT CmDet ON;

这将允许您将显式值插入表的标识列。

答案 1 :(得分:0)

以下是插入“复制”行并将公司值替换为12的代码。不要在列表中包含ID列,而是用适当的列名替换a,b,c,d,e。在SELECT声明中使用相同的列表, 除了公司!

INSERT  INTO TBL
        ( a,
          b,
          c,
          d,
          e,
          company
        )
        SELECT
            a,
            b,
            c,
            d,
            e,
            12 AS company
        FROM
            TBL
        WHERE
            1=1
            -- Include the following line if you only want specific rows (company 11)
            AND company = 11