sql server 如何复制多条记录,且更改其中字段的值

静叶01 2014-10-24 12:01:29
我现在有一张表,表中的数据时这样的
http://img.my.csdn.net/uploads/201410/24/1414122624_7493.png
(上传不上去)
复制出来

recorderNO ncd40924ncdrw curStatus ncd40924ncjrw05 procID curNodeID linkRecordID
Z201410220000168 Z200902090000007 2 概预算 wfprocZ141022000015 xmgzrvZ131017000003 Z201410220000007
Z201410220000169 Z201301070000039 2 水土保持 wfprocZ141022000015 xmgzrvZ131017000003 Z201410220000007
Z201410220000170 200804170000012 2 规划 wfprocZ141022000015 xmgzrvZ131017000003 Z201410220000007
Z201410220000171 200804170000012 2 施工 wfprocZ141022000015 xmgzrvZ131017000003 Z201410220000007
Z201410220000172 Z201301070000039 2 勘测 wfprocZ141022000015 xmgzrvZ131017000003 Z201410220000007
Z201410220000173 200804170000012 2 建筑 wfprocZ141022000015 hzyjvvZ131017000001 Z201410220000022
Z201410220000174 200804170000012 2 水土保持 wfprocZ141022000015 hzyjvvZ131017000001 Z201410220000022
Z201410220000175 200808010000003 2 概预算 wfprocZ141022000015 hzyjvvZ131017000001 Z201410220000022
Z201410220000176 200811290000002 2 机电 wfprocZ141022000015 hzyjvvZ131017000001 Z201410220000023






这是原型
insert into ncdbmZ14092400001--表名
select
recorderNO,--主键(类型为varchar)
ncd40924ncdrw02, --字段
curStatus,--字段
ncd40924ncjrw05,--字段
procID,--字段
curNodeID,--字段
linkRecordID --字段
from ncdbmZ14092400001 --表名
where procID='条件' and curNodeID='条件' and linkRecordID ='条件';

这是我要操作的数据
insert into ncdbmZ14092400001--表名
select
‘替换成想插入的数据’,--主键(类型为varchar),主键不能重复
ncd40924ncdrw02, --字段
curStatus,--字段
ncd40924ncjrw05,--字段
procID,--字段
'替换成想插入的数据',--字段,
'替换成想插入的数据' --字段
from ncdbmZ14092400001 --表名
where procID='条件' and curNodeID='条件' and linkRecordID ='条件';


执行完之后,报的错误是recorderNO,违反约束条件,遇到这种情况,有解决的办法吗
...全文
1395 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
静叶01 2014-10-27
  • 打赏
  • 举报
回复
引用 10 楼 u010024618 的回复:
这里有一个简单的处理办法,你看可否: step #1: 从ncdbmZ14092400001表中筛选期待的行,使用Row_number()函数生成一个‘序号’列,由于recorderNO是主键,所以可按主键列recorderNO生成唯一序号。 step#2: 将‘序号’列当成主键列插入到ncdbmZ14092400001表。 Step#3:将recorderNO更新为自己期待的值。 简化的T-sql
--Step #1:
;WITH t1 AS
(
 SELECT recorderNO,--主键(类型为varchar)
		ncd40924ncdrw02, --字段
		curStatus,--字段
		ncd40924ncjrw05,--字段
		procID,--字段
		curNodeID,--字段
		linkRecordID,  --字段
		ROW_NUMBER() OVER(ORDER BY recorderNO) 'Flag' --Flag这里列将是唯一的
from ncdbmZ14092400001 --表名
where procID='条件' and curNodeID='条件' and linkRecordID ='条件'
)
--Step #2:
INSERT INTO ncdbmZ14092400001
SELECT  Flag,  --将Flag列替换recorderNO列
        ncd40924ncdrw02, --字段
		curStatus,--字段
		ncd40924ncjrw05,--字段
		procID,--字段
		curNodeID,--字段
		linkRecordID  --字段
FROM t1 
--Step #3:
--第三步按需求更新recorderNO的值
我试试,有劳您费心了
静叶01 2014-10-27
  • 打赏
  • 举报
回复
引用 9 楼 ky_min 的回复:
如果不需要唯一约束~ 删掉不就可以了吗
肯定是需要的
静叶01 2014-10-27
  • 打赏
  • 举报
回复
引用 8 楼 wmxcn2000 的回复:
1.先删除原来的,再导入; 2.导入时过虑一下重复的;
不能删除元数据,我再想想
freecodex 2014-10-24
  • 打赏
  • 举报
回复
你的意思这样么: 从 ncdbmZ14092400001这个表中筛选符合条件的记录,然后又插入到这个表中。但是由于该表中存在主键约束,所以需要把查询到的记录中主键字段的值换掉后再插入到ncdbmZ14092400001中。 是这个意思吧 ?另外,主键字段recorderNO的值换掉前后有什么关系(或者算法是怎样的)?
發糞塗牆 2014-10-24
  • 打赏
  • 举报
回复
不用也行,但是你的报错是违反了约束,那个recordno要么不要设为主键或者唯一约束,要么在插入时修改成别的值
静叶01 2014-10-24
  • 打赏
  • 举报
回复
引用 1 楼 DBA_Huangzj 的回复:
查出来放到临时表,然后再更新,不过要考虑主键问题,不然就违反约束
要是不用临时表怎么解决啊 我用程序向数据库发送SQL语句执行
發糞塗牆 2014-10-24
  • 打赏
  • 举报
回复
查出来放到临时表,然后再更新,不过要考虑主键问题,不然就违反约束
Tiger_Zhao 2014-10-24
  • 打赏
  • 举报
回复
/* 不就是需要按编码规则生成新记录的 recorderNo 而已。
估计 recorderNo 编码规则为: 'Z' + yyyymmdd + 7位序号
*/
DECLARE @prefix varchar(9) -- 今天的编码前缀
DECLARE @serialNo int -- 今天的最大序号

SET @prefix = 'Z' + Convert(varchar(8),GetDate(),112)

SELECT @serialNo = Convert(int,
SubString(ISNULL(MAX(recorderNo),
@prefix + '0000000'
),
10,
7)
)
FROM ncdbmZ14092400001
WHERE recorderNo LIKE @prefix+'%'

;WITH newData AS (
--这是我要操作的数据
select ROW_NUMBER() OVER(ORDER BY recorderNo) rn,
ncd40924ncdrw02,
curStatus,
ncd40924ncjrw05,
procID,
'替换成想插入的数据' curNodeID,
'替换成想插入的数据' linkRecordID
from ncdbmZ14092400001
where procID='条件'
and curNodeID='条件'
and linkRecordID ='条件'
)
insert into ncdbmZ14092400001
SELECT @prefix + Right('0000000' + Convert(varchar(7),
@serialNo+rn),
7),
ncd40924ncdrw02,
curStatus,
ncd40924ncjrw05,
procID,
curNodeID,
linkRecordID
from newData
freecodex 2014-10-24
  • 打赏
  • 举报
回复
这里有一个简单的处理办法,你看可否: step #1: 从ncdbmZ14092400001表中筛选期待的行,使用Row_number()函数生成一个‘序号’列,由于recorderNO是主键,所以可按主键列recorderNO生成唯一序号。 step#2: 将‘序号’列当成主键列插入到ncdbmZ14092400001表。 Step#3:将recorderNO更新为自己期待的值。 简化的T-sql
--Step #1:
;WITH t1 AS
(
 SELECT recorderNO,--主键(类型为varchar)
		ncd40924ncdrw02, --字段
		curStatus,--字段
		ncd40924ncjrw05,--字段
		procID,--字段
		curNodeID,--字段
		linkRecordID,  --字段
		ROW_NUMBER() OVER(ORDER BY recorderNO) 'Flag' --Flag这里列将是唯一的
from ncdbmZ14092400001 --表名
where procID='条件' and curNodeID='条件' and linkRecordID ='条件'
)
--Step #2:
INSERT INTO ncdbmZ14092400001
SELECT  Flag,  --将Flag列替换recorderNO列
        ncd40924ncdrw02, --字段
		curStatus,--字段
		ncd40924ncjrw05,--字段
		procID,--字段
		curNodeID,--字段
		linkRecordID  --字段
FROM t1 
--Step #3:
--第三步按需求更新recorderNO的值
还在加载中灬 2014-10-24
  • 打赏
  • 举报
回复
如果不需要唯一约束~ 删掉不就可以了吗
卖水果的net 2014-10-24
  • 打赏
  • 举报
回复
1.先删除原来的,再导入; 2.导入时过虑一下重复的;
發糞塗牆 2014-10-24
  • 打赏
  • 举报
回复
但是既然叫唯一约束,你又要插入重复值,本身就有冲突
静叶01 2014-10-24
  • 打赏
  • 举报
回复
引用 3 楼 DBA_Huangzj 的回复:
不用也行,但是你的报错是违反了约束,那个recordno要么不要设为主键或者唯一约束,要么在插入时修改成别的值
要是不设唯一约束的话,以后修改的时候就不好修改了
静叶01 2014-10-24
  • 打赏
  • 举报
回复
引用 4 楼 u010024618 的回复:
你的意思这样么: 从 ncdbmZ14092400001这个表中筛选符合条件的记录,然后又插入到这个表中。但是由于该表中存在主键约束,所以需要把查询到的记录中主键字段的值换掉后再插入到ncdbmZ14092400001中。 是这个意思吧 ?另外,主键字段recorderNO的值换掉前后有什么关系(或者算法是怎样的)?
对,就是这个意思 换掉前后没什么关系

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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