由于工作需要,需要对有自增列的表插入数据,带自增列的表有很多,计划使用查询插入的方式来实现。
这种存在自增列表是无法直接插入数据的,需要设置IDENTITY_INSERT为ON。DM要求一个会话连接中只有一个表的 IDENTITY_INSERT 属性可以设置为 ON,当设置一个新的表IDENTITY_INSERT 属性设置为ON时,之前已经设置为ON的表会自动还原为OFF。因此每次insert into一张表之前都要先执行一次set IDENTITY_INSERT on 的语句。
此外,insert into的语句必须要指明列名,例如:
insert into a select * from b;
上面这种方式是无法成功插入数据的,正确语句如下:
insert into a ("ID","NAME","EMAIL") select * from b;
当数据库中有多张表时,则使用以下语句即可拼出所有的查询插入语句
- SELECT
- ' SET IDENTITY_INSERT "'
- ||B.NAME
- ||'" ON; INSERT INTO "'
- ||B.NAME
- ||'"("'
- ||LISTAGG(A.NAME, '","') WITHIN GROUP (
- ORDER BY
- A.COLID)
- ||'") SELECT * FROM "'
- ||B.NAME
- ||'";'
- FROM
- SYSCOLUMNS A
- INNER JOIN SYSOBJECTS B
- ON
- A.ID=B.ID
- WHERE
- B.NAME IN
- (
- SELECT DISTINCT
- S.NAME
- FROM
- SYSOBJECTS S,
- SYSCOLUMNS C
- WHERE
- S.ID =C.ID
- AND C.INFO2 =1
- AND S.NAME IN
- (
- SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME NOT LIKE 'CTI%'
- )
- )
- AND B.SCHID=
- (
- SELECT ID FROM SYSOBJECTS WHERE TYPE$='SCH' AND NAME='SYSDBA'
- )
- GROUP BY
- B.NAME;
以上SQL执行结束后,将查询结果集中的SQL语句批量执行即可。
更多内容请参考达梦数据库技术社区:https://eco.dameng.com
个人博客:Jackin's Blog