Copy Code Trigger Definition

        
        CREATE trigger dbo.TR_ACCOUNTSTRUCTURE_INS
        on dbo.ACCOUNTSTRUCTURE
        after insert
        as
        set nocount on

        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