数据库骚操作2——列名获取
后台数据库操作的时候,有时候需要将数据从备份表中插回到系统表里。虽然可以简单的用insert into t_gl_balance select * from t_gl_balancebak,但是在以下场景不能直接使用:
1、包含种子列
2、包含计算列
3、包含时间戳
4、源表中列的排序与目标表中列的排序不相同,因为上面语句并没有显式列出列名
这种情况,就需要显式列出所有的列名了。显式列出所有的列名,一两个表还算可以,多个表就让人头痛了,那么,有什么简单快捷的方法可以获取所有普通列的列名呢?
当。。。当。。。当。。。当。。。
【存储过程】
可以直接使用以下存储过程:
注意:下面方案没有排除种子列,因为种子列是可以通过修改表的参数为允许插入种子列来规避直接插入报错问题。
--存储过程
if exists (select 1 from sys.objects where name='sp_columncollect' and type='P')
drop procedure sp_columncollect
go
create procedure sp_columncollect
@ftablename nvarchar(100),
@string nvarchar(2000) out
as
if not exists (select 1 from sys.tables where name like 'hb_columncollect')
create table hb_columncollect(ffieldname nvarchar(100) ,fid int )
delete from hb_columncollect
exec('insert into hb_columncollect(ffieldname,fid)
select name,column_id from sys.columns t where object_id=OBJECT_ID('''+@ftablename+''') and is_computed<>1 and system_type_id<>189 order by column_id ')
set @string=''
select @string=@string+ffieldname+',' from hb_columncollect order by fid
set @string=substring(@string,1,len(@string)-1)
delete from hb_columncollect
go
【存储过程调用】
--执行测试
declare @string nvarchar(2000)
exec sp_columncollect 't_gl_balance',@string out
--结果显示
select @string FACCOUNTBOOKID,FYEAR,FPERIOD,FACCOUNTID,FDETAILID,FCURRENCYID,FBEGINBALANCEFOR,FBEGINBALANCE,FDEBITFOR,FDEBIT,FCREDITFOR,FCREDIT,FYTDDEBITFOR,FYTDDEBIT,FYTDCREDITFOR,FYTDCREDIT,FENDBALANCEFOR,FENDBALANCE,FADJUSTPERIOD
学习
好骚啊,我喜欢
数据库骚操作2——列名获取
本文2024-09-16 18:42:50发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-23924.html