TR_ACCOUNTSTRUCTURE_INS
Definition
Copy
CREATE trigger dbo.TR_ACCOUNTSTRUCTURE_INS
on dbo.ACCOUNTSTRUCTURE
after insert
as
set nocount on
if (select count(*) from INSERTED) > 0
begin
declare @OVs table (ID uniqueidentifier, SEGMENTCOLUMN smallint, ELEMENTTYPECODE tinyint)
declare @SegmentColumn tinyint
declare @SQL nvarchar(2000)
declare @Columns nvarchar(2000)
update ACCOUNTSTRUCTURE
set SEGMENTCOLUMN = (select V2.NUM
from
(select ID, row_number() over (order by SEQUENCE) as RowNumber
from dbo.ACCOUNTSTRUCTURE
where SEGMENTCOLUMN = 0) V1
inner join
(select top 30 NUM, row_number() over (order by NUM) as RowNumber
from dbo.NUMBERS
where not exists (select * from dbo.ACCOUNTSTRUCTURE where ACCOUNTSTRUCTURE.SEGMENTCOLUMN = NUMBERS.NUM)
order by NUM) V2
on V1.RowNumber = V2.RowNumber
where V1.ID = ACCOUNTSTRUCTURE.ID)
output inserted.ID, inserted.SEGMENTCOLUMN, inserted.ELEMENTTYPECODE into @OVs
where SEGMENTCOLUMN = 0
declare Cur Cursor fast_forward
for
select SEGMENTCOLUMN
from @OVs
where ELEMENTTYPECODE = 1
open Cur
fetch next from Cur into @SegmentColumn
while @@Fetch_Status = 0
begin
set @SQL = 'if not exists (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N''[dbo].[LEDGERACCOUNT]'') AND name = N''IX_LEDGERACCOUNT_DATAELEMENT'+convert(nvarchar(2),@SegmentColumn)+'ID_DYN'')
create index IX_LEDGERACCOUNT_DATAELEMENT'+convert(nvarchar(2),@SEGMENTCOLUMN)+'ID_DYN on dbo.LEDGERACCOUNT (DATAELEMENT'+convert(nvarchar(2),@SEGMENTCOLUMN)+'ID)'
exec (@SQL)
fetch next from Cur into @SegmentColumn
end
close cur
deallocate cur
select @Columns = (select top 15 'DATAELEMENT'+convert(nvarchar(2),SEGMENTCOLUMN)+'ID,'
from dbo.ACCOUNTSTRUCTURE
where ELEMENTTYPECODE = 1
order by SEGMENTCOLUMN
for xml path(''))
set @SQL = 'CREATE NONCLUSTERED INDEX [IX_LEDGERACCOUNT_DATAELEMENTS_DYN] ON [dbo].[LEDGERACCOUNT]
('+substring(@Columns,1,len(@Columns)-1)+')'
if exists (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.LEDGERACCOUNT') AND name = N'IX_LEDGERACCOUNT_DATAELEMENTS_DYN')
set @SQL = @SQL+' with (DROP_EXISTING=ON)'
exec (@SQL)
if (select count(*) from dbo.ACCOUNTSTRUCTURE where ELEMENTTYPECODE = 1) > 15
begin
select @Columns = (select top 15 'DATAELEMENT'+convert(nvarchar(2),SEGMENTCOLUMN)+'ID,'
from accountstructure
where SEGMENTCOLUMN > (select max(SEGMENTCOLUMN) from (select top 15 SEGMENTCOLUMN from dbo.ACCOUNTSTRUCTURE where ELEMENTTYPECODE = 1) V1)
order by SEGMENTCOLUMN
for xml path(''))
set @SQL = 'CREATE NONCLUSTERED INDEX [IX_LEDGERACCOUNT_DATAELEMENTS_ADDITIONAL_DYN] ON [dbo].[LEDGERACCOUNT]
('+substring(@Columns,1,len(@Columns)-1)+')
INCLUDE (ACCOUNTSTRING,ID)'
if exists (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.LEDGERACCOUNT') AND name = N'IX_LEDGERACCOUNT_DATAELEMENTS_ADDITIONAL_DYN')
set @SQL = @SQL+' with (DROP_EXISTING=ON)'
exec (@SQL)
end
end