由于工作需要,需要对有自增列的表插入数据,带自增列的表有很多,计划使用查询插入的方式来实现。
这种存在自增列表是无法直接插入数据的,需要设置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