Aenean ornare velit lacus, ac varius enim lorem ullamcorper dolore aliquam.
Illustrerò tutti i passaggi da esegire al fine di non incorrere in errori, è importante seguire l'ordine dei passaggi illustrati in seguito al fine di non icorrere in errori. probabilmente alcuni passaggi possono essere eseguiti in altro ordine senza incrrere in errori ma altri sono propedeutici. mi riservo di approfondire successivamente gli argomenti
Controllo che nella tabella di configurazione sino presente un campo relativo ad un documento di giacenza inisiale che servirà per riportare il saldo dei documenti che verranno eliminati
USE [Archivio31]
if isnull((SELECT IsNULL(Configurazione,-1) FROM TabSystemConfig WHERE Parametro='TipoDocumentoGiacenzeIniziali'),-1)<0
BEGIN
RAISERROR ('ERRORE TipoDocumentoGiacenzeIniziali' /* Message text.*/,16/*Severity.*/ , 1 /*State.*/);
END
Elimino e ricreo le tabelle [BKP_giacenze],[BKP_configurazione],[BKP_IDDocumento] che mi servono per la configurazione della pulizia e riportare i saldi precedenti
USE [Archivio31]
GO
DROP TABLE IF EXISTS BKP_giacenze;
DROP TABLE IF EXISTS BKP_configurazione;
DROP TABLE IF EXISTS BKP_IDDocumento;
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[BKP_giacenze](
[NEW_IDDocumento] [uniqueidentifier] NULL,
[NEW_IDDocumentocontatore] [uniqueidentifier] NULL,
[idarticolo] [varchar](20) NULL,
[quantità] [int] NULL,
[IDAnagrafica] [varchar](5) NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[BKP_configurazione](
[Parametro] [varchar](249) NOT NULL,
[valore] [varchar](249) NOT NULL,
[Configurazione] [varchar](249) NOT NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[BKP_IDDocumento](
[IDDocumento] [uniqueidentifier] NOT NULL
) ON [PRIMARY]
GO
prima di procedere lancio la seguente query, recupero il risultato e lo eseguo per essere certo che non vi siano chiavi duplicate
select 'select ''duplicati in tabella '+ tabella.name+' chiave '+indice.name+''' ''errore'',
'+stuff((select
', ' +col.name
from sys.tables tb
inner join sys.indexes ix on tb.object_id=ix.object_id
inner join sys.index_columns ixc on ix.object_id=ixc.object_id and ix.index_id= ixc.index_id
inner join sys.columns col on ixc.object_id =col.object_id and ixc.column_id=col.column_id
where ix.type>0 and (ix.is_primary_key=1 or ix.is_unique_constraint=1)
and schema_name(tb.schema_id)='dbo' and tb.name=tabella.name and ix.name=indice.name
order by 1 for xml path('')), 1, 1, '')+' , count(*) from '+tabella.name+' group by '+stuff((select
', ' +col.name
from sys.tables tb
inner join sys.indexes ix on tb.object_id=ix.object_id
inner join sys.index_columns ixc on ix.object_id=ixc.object_id and ix.index_id= ixc.index_id
inner join sys.columns col on ixc.object_id =col.object_id and ixc.column_id=col.column_id
where ix.type>0 and (ix.is_primary_key=1 or ix.is_unique_constraint=1)
and schema_name(tb.schema_id)='dbo' and tb.name=tabella.name and ix.name=indice.name
order by 1 for xml path('')), 1, 1, '')+' having count(*)>1 '
from sys.tables tabella
inner join sys.indexes indice on tabella.object_id=indice.object_id
where indice.type>0 and (indice.is_primary_key=1 or indice.is_unique_constraint=1)
and tabella.is_ms_shipped=0 and tabella.name<>'sysdiagrams'
order by schema_name(tabella.schema_id), tabella.name, indice.name
lancio la seguente query per controllare che siano presenti tutte le stored procedure che serviranno, se mancano le creo
if isnull((SELECT count(*) FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = 'PROCEDURE'
AND ROUTINE_NAME in ( '_Script_CREATE_ALL_FK','_Script_CREATE_ALL_INDEX','_Script_CREATE_ALL_PK_UNIQUECONSTRAINTS','_Script_DROP_ALL_FK','_Script_DROP_ALL_PK_UNIQUECONSTRAINTS','_Script_DROP_ALL_INDEX')),-1)<>6
BEGIN
RAISERROR ('ERRORE mancano le stored procedure' /* Message text.*/,16/*Severity.*/ , 1 /*State.*/);
END
IF OBJECT_ID('dbo._Script_CREATE_ALL_FK', 'P') IS NOT NULL
BEGIN
DROP PROCEDURE dbo._Script_CREATE_ALL_FK;
END;
GO
IF OBJECT_ID('dbo._Script_CREATE_ALL_INDEX', 'P') IS NOT NULL
BEGIN
DROP PROCEDURE dbo._Script_CREATE_ALL_INDEX;
END;
GO
IF OBJECT_ID('dbo._Script_CREATE_ALL_PK_UNIQUECONSTRAINTS', 'P') IS NOT NULL
BEGIN
DROP PROCEDURE dbo._Script_CREATE_ALL_PK_UNIQUECONSTRAINTS;
END;
GO
IF OBJECT_ID('dbo._Script_DROP_ALL_FK', 'P') IS NOT NULL
BEGIN
DROP PROCEDURE dbo._Script_DROP_ALL_FK;
END;
GO
IF OBJECT_ID('dbo._Script_DROP_ALL_PK_UNIQUECONSTRAINTS', 'P') IS NOT NULL
BEGIN
DROP PROCEDURE dbo._Script_DROP_ALL_PK_UNIQUECONSTRAINTS;
END;
GO
IF OBJECT_ID('dbo._Script_DROP_ALL_INDEX', 'P') IS NOT NULL
BEGIN
DROP PROCEDURE dbo._Script_DROP_ALL_INDEX;
END;
GO
USE [Archivio31]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[_Script_DROP_ALL_FK]
AS
BEGIN
declare @ForeignKeyName varchar(4000)
declare @ParentTableName varchar(4000)
declare @ParentTableSchema varchar(4000)
declare @TSQLDropFK varchar(max)
declare CursorFK cursor for
select fk.name ForeignKeyName, schema_name(t.schema_id) ParentTableSchema, t.name ParentTableName
from sys.foreign_keys fk inner join sys.tables t on fk.parent_object_id=t.object_id
print 'DECLARE @startdate DATETIME2 = getdate(); '
open CursorFK
fetch next from CursorFK into @ForeignKeyName, @ParentTableSchema, @ParentTableName
while (@@FETCH_STATUS=0)
begin
set @TSQLDropFK ='print ''cancellazione foreign key da tabella ' + QUOTENAME(@ParentTableName) + ''';
ALTER TABLE '+quotename(@ParentTableSchema)+'.'+quotename(@ParentTableName)+' DROP CONSTRAINT '+quotename(@ForeignKeyName)+ char(13) + '
print ''foreign key ' +QUOTENAME(@ForeignKeyName) +' da tabella ' + QUOTENAME(@ParentTableName) + ' cancellata'';
'
print @TSQLDropFK
fetch next from CursorFK into @ForeignKeyName, @ParentTableSchema, @ParentTableName
end
close CursorFK
deallocate CursorFK
print ' DECLARE @enddate DATETIME2 = getdate();
SELECT ''esecuzione processo durata minuti: ''+ cast(DATEDIFF(minute, @startdate, @enddate) as varchar); '
END
GO
USE [Archivio31]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[_Script_CREATE_ALL_PK_UNIQUECONSTRAINTS]
AS
BEGIN
declare @SchemaName varchar(100)
declare @TableName varchar(256)
declare @IndexName varchar(256)
declare @ColumnName varchar(100)
declare @is_unique_constraint varchar(100)
declare @IndexTypeDesc varchar(100)
declare @FileGroupName varchar(100)
declare @is_disabled varchar(100)
declare @IndexOptions varchar(max)
declare @IndexColumnId int
declare @IsDescendingKey int
declare @IsIncludedColumn int
declare @TSQLScripCreationIndex varchar(max)
declare @TSQLScripDisableIndex varchar(max)
declare @is_primary_key varchar(100)
declare CursorIndex cursor for
select schema_name(t.schema_id) [schema_name], t.name, ix.name,
case when ix.is_unique_constraint = 1 then ' UNIQUE ' else '' END
,case when ix.is_primary_key = 1 then ' PRIMARY KEY ' else '' END
, ix.type_desc,
case when ix.is_padded=1 then 'PAD_INDEX = ON, ' else 'PAD_INDEX = OFF, ' end
+ case when ix.allow_page_locks=1 then 'ALLOW_PAGE_LOCKS = ON, ' else 'ALLOW_PAGE_LOCKS = OFF, ' end
+ case when ix.allow_row_locks=1 then 'ALLOW_ROW_LOCKS = ON, ' else 'ALLOW_ROW_LOCKS = OFF, ' end
+ case when INDEXPROPERTY(t.object_id, ix.name, 'IsStatistics') = 1 then 'STATISTICS_NORECOMPUTE = ON, ' else 'STATISTICS_NORECOMPUTE = OFF, ' end
+ case when ix.ignore_dup_key=1 then 'IGNORE_DUP_KEY = ON, ' else 'IGNORE_DUP_KEY = OFF, ' end
+ 'SORT_IN_TEMPDB = OFF, FILLFACTOR =' + CAST((CASE WHEN ix.fill_factor=0 THEN 90 ELSE ix.fill_factor END) AS VARCHAR(3)) AS IndexOptions
, FILEGROUP_NAME(ix.data_space_id) FileGroupName
from sys.tables t
inner join sys.indexes ix on t.object_id=ix.object_id
where ix.type>0 and (ix.is_primary_key=1 or ix.is_unique_constraint=1)
and t.is_ms_shipped=0 and t.name<>'sysdiagrams'
order by schema_name(t.schema_id), t.name, ix.name
print 'DECLARE @startdate DATETIME2 = getdate(); '
open CursorIndex
fetch next from CursorIndex into @SchemaName, @TableName, @IndexName, @is_unique_constraint, @is_primary_key, @IndexTypeDesc, @IndexOptions, @FileGroupName
while (@@fetch_status=0)
begin
declare @IndexColumns varchar(max)
declare @IncludedColumns varchar(max)
set @IndexColumns=''
set @IncludedColumns=''
declare CursorIndexColumn cursor for
select col.name, ixc.is_descending_key, ixc.is_included_column
from sys.tables tb
inner join sys.indexes ix on tb.object_id=ix.object_id
inner join sys.index_columns ixc on ix.object_id=ixc.object_id and ix.index_id= ixc.index_id
inner join sys.columns col on ixc.object_id =col.object_id and ixc.column_id=col.column_id
where ix.type>0 and (ix.is_primary_key=1 or ix.is_unique_constraint=1)
and schema_name(tb.schema_id)=@SchemaName and tb.name=@TableName and ix.name=@IndexName
order by ixc.index_column_id
open CursorIndexColumn
fetch next from CursorIndexColumn into @ColumnName, @IsDescendingKey, @IsIncludedColumn
while (@@fetch_status=0)
begin
if @IsIncludedColumn=0
set @IndexColumns=@IndexColumns + @ColumnName + case when @IsDescendingKey=1 then ' DESC, ' else ' ASC, ' end
else
set @IncludedColumns=@IncludedColumns + @ColumnName +', '
fetch next from CursorIndexColumn into @ColumnName, @IsDescendingKey, @IsIncludedColumn
end
close CursorIndexColumn
deallocate CursorIndexColumn
set @IndexColumns = case when len(@IndexColumns) >0 then substring(@IndexColumns, 1, len(@IndexColumns)-1) else '' end
--set @IndexColumns = substring(@IndexColumns, 1, len(@IndexColumns)-1)
set @IncludedColumns = case when len(@IncludedColumns) >0 then substring(@IncludedColumns, 1, len(@IncludedColumns)-1) else '' end
set @TSQLScripCreationIndex =''
set @TSQLScripDisableIndex =''
set @TSQLScripCreationIndex='print ''creazione pk ' + QUOTENAME(@IndexName) + @is_unique_constraint + @is_primary_key + +@IndexTypeDesc + '('+@IndexColumns+') '+' su tabella ' + QUOTENAME(@TableName) + ''';
ALTER TABLE [Archivio31_new].'+ QUOTENAME(@SchemaName) +'.'+ QUOTENAME(@TableName)+ ' ADD CONSTRAINT ' + QUOTENAME(@IndexName) + @is_unique_constraint + @is_primary_key + +@IndexTypeDesc + '('+@IndexColumns+') '+
case when len(@IncludedColumns)>0 then CHAR(13) +'INCLUDE (' + @IncludedColumns+ ')' else '' end + CHAR(13)+'WITH (' + @IndexOptions+ ') ON ' + QUOTENAME(@FileGroupName) + ';
print ''chiave pk ' + QUOTENAME(@IndexName) + @is_unique_constraint + @is_primary_key + +@IndexTypeDesc + '('+@IndexColumns+') '+' creata su tabella ' + QUOTENAME(@TableName) + ''';
'
print @TSQLScripCreationIndex
print @TSQLScripDisableIndex
fetch next from CursorIndex into @SchemaName, @TableName, @IndexName, @is_unique_constraint, @is_primary_key, @IndexTypeDesc, @IndexOptions, @FileGroupName
end
close CursorIndex
deallocate CursorIndex
print ' DECLARE @enddate DATETIME2 = getdate();
SELECT ''esecuzione processo durata minuti: ''+ cast(DATEDIFF(minute, @startdate, @enddate) as varchar); '
PRINT '/* SALVARE COME CREATE_ALL_PK_UNIQUECONSTRAINTS.sql */';
END
GO
USE [Archivio31];
GO
IF OBJECT_ID('dbo._Script_CREATE_ALL_INDEX', 'P') IS NOT NULL
BEGIN
DROP PROCEDURE dbo._Script_CREATE_ALL_INDEX;
END;
GO
CREATE PROCEDURE dbo._Script_CREATE_ALL_INDEX
as
BEGIN
DECLARE @SchemaName VARCHAR(100)
DECLARE @TableName VARCHAR(256)
DECLARE @IndexName VARCHAR(256)
DECLARE @is_unique VARCHAR(100)
DECLARE @IndexTypeDesc VARCHAR(100)
DECLARE @FileGroupName VARCHAR(100)
DECLARE @is_disabled VARCHAR(100)
DECLARE @IndexOptions VARCHAR(MAX)
DECLARE @IndexColumnId INT
DECLARE @ColumnName VARCHAR(100)
DECLARE @IsDescendingKey INT
DECLARE @IsIncludedColumn INT
DECLARE @TSQLScripCreationIndex VARCHAR(MAX)
DECLARE @TSQLScripDisableIndex VARCHAR(MAX)
DECLARE @IsColumnstore BIT
DECLARE @IndexColumns VARCHAR(MAX)
DECLARE @IncludedColumns VARCHAR(MAX)
PRINT 'USE [Archivio31_new];'
PRINT 'DECLARE @startdate DATETIME2 = getdate();'
DECLARE CursorIndex CURSOR FOR
SELECT
SCHEMA_NAME(t.schema_id) AS [schema_name],
t.name,
ix.name,
CASE WHEN ix.is_unique = 1 THEN 'UNIQUE ' ELSE '' END,
ix.type_desc,
CASE WHEN ix.is_padded = 1 THEN 'PAD_INDEX = ON, ' ELSE 'PAD_INDEX = OFF, ' END +
CASE WHEN ix.allow_page_locks = 1 THEN 'ALLOW_PAGE_LOCKS = ON, ' ELSE 'ALLOW_PAGE_LOCKS = OFF, ' END +
CASE WHEN ix.allow_row_locks = 1 THEN 'ALLOW_ROW_LOCKS = ON, ' ELSE 'ALLOW_ROW_LOCKS = OFF, ' END +
CASE WHEN INDEXPROPERTY(t.object_id, ix.name, 'IsStatistics') = 1 THEN 'STATISTICS_NORECOMPUTE = ON, ' ELSE 'STATISTICS_NORECOMPUTE = OFF, ' END +
CASE WHEN ix.ignore_dup_key = 1 THEN 'IGNORE_DUP_KEY = ON, ' ELSE 'IGNORE_DUP_KEY = OFF, ' END +
'SORT_IN_TEMPDB = OFF, FILLFACTOR = ' + CAST(ISNULL(NULLIF(ix.fill_factor, 0), 90) AS VARCHAR(3)) AS IndexOptions,
ix.is_disabled,
FILEGROUP_NAME(ix.data_space_id) AS FileGroupName
FROM
sys.tables t
INNER JOIN sys.indexes ix ON t.object_id = ix.object_id
WHERE
ix.type > 0
AND ix.is_primary_key = 0
AND ix.is_unique_constraint = 0
AND t.is_ms_shipped = 0
AND t.name <> 'sysdiagrams'
ORDER BY
SCHEMA_NAME(t.schema_id), t.name, ix.name;
OPEN CursorIndex;
FETCH NEXT FROM CursorIndex INTO @SchemaName, @TableName, @IndexName, @is_unique, @IndexTypeDesc, @IndexOptions, @is_disabled, @FileGroupName;
WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @IndexColumns = '';
SET @IncludedColumns = '';
SET @IsColumnstore = CASE WHEN @IndexTypeDesc IN ('CLUSTERED COLUMNSTORE', 'NONCLUSTERED COLUMNSTORE') THEN 1 ELSE 0 END;
DECLARE CursorIndexColumn CURSOR FOR
SELECT
col.name,
ixc.is_descending_key,
ixc.is_included_column
FROM
sys.tables tb
INNER JOIN sys.indexes ix ON tb.object_id = ix.object_id
INNER JOIN sys.index_columns ixc ON ix.object_id = ixc.object_id AND ix.index_id = ixc.index_id
INNER JOIN sys.columns col ON ixc.object_id = col.object_id AND ixc.column_id = col.column_id
WHERE
tb.object_id = OBJECT_ID(QUOTENAME(@SchemaName) + '.' + QUOTENAME(@TableName))
AND ix.name = @IndexName
ORDER BY
ixc.index_column_id;
OPEN CursorIndexColumn;
FETCH NEXT FROM CursorIndexColumn INTO @ColumnName, @IsDescendingKey, @IsIncludedColumn;
WHILE (@@FETCH_STATUS = 0)
BEGIN
IF @IsColumnstore = 1
BEGIN
-- Per COLUMNSTORE: tutti le colonne sono incluse allo stesso modo
SET @IndexColumns = @IndexColumns + QUOTENAME(@ColumnName) + ', ';
END
ELSE
BEGIN
-- Logica originale per indici ROWSTORE
IF @IsIncludedColumn = 0
SET @IndexColumns = @IndexColumns + QUOTENAME(@ColumnName) + CASE WHEN @IsDescendingKey = 1 THEN ' DESC, ' ELSE ' ASC, ' END
ELSE
SET @IncludedColumns = @IncludedColumns + QUOTENAME(@ColumnName) + ', ';
END
FETCH NEXT FROM CursorIndexColumn INTO @ColumnName, @IsDescendingKey, @IsIncludedColumn;
END
CLOSE CursorIndexColumn;
DEALLOCATE CursorIndexColumn;
-- Pulizia delle colonne
SET @IndexColumns = CASE WHEN LEN(@IndexColumns) >0 THEN LEFT(@IndexColumns, LEN(@IndexColumns) - 1) ELSE '' END;
SET @IncludedColumns = CASE WHEN LEN(@IncludedColumns) >0 THEN LEFT(@IncludedColumns, LEN(@IncludedColumns) - 1) ELSE '' END;
--SET @IndexColumns = CASE WHEN LEN(@IndexColumns) >0 THEN SUBSTRING(@IndexColumns, 1, LEN(@IndexColumns)-1) ELSE '' END
--SET @IncludedColumns = CASE WHEN LEN(@IncludedColumns) >0 THEN SUBSTRING(@IncludedColumns, 1, LEN(@IncludedColumns)-1) ELSE '' END
-- Generazione script CREATE INDEX
SET @TSQLScripCreationIndex = '';
SET @TSQLScripDisableIndex = '';
IF @IsColumnstore = 1
BEGIN
-- Gestione COLUMNSTORE
DECLARE @ColumnList VARCHAR(MAX) = CASE
WHEN @IndexTypeDesc = 'CLUSTERED COLUMNSTORE' THEN ''
ELSE '(' + @IndexColumns + ')'
END;
SET @TSQLScripCreationIndex =
'PRINT ''Creazione indice COLUMNSTORE: ' + QUOTENAME(@IndexName) + ' ON ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@TableName) + ''';' + CHAR(13) +
'CREATE ' +
CASE @IndexTypeDesc
WHEN 'CLUSTERED COLUMNSTORE' THEN 'CLUSTERED '
ELSE 'NONCLUSTERED '
END + 'COLUMNSTORE INDEX ' + QUOTENAME(@IndexName) +
' ON ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@TableName) +
@ColumnList +
' ON ' + QUOTENAME(@FileGroupName) + ';' + CHAR(13) +
'PRINT ''Indice COLUMNSTORE ' + QUOTENAME(@IndexName) + ' creato su ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@TableName) + ''';';
END
ELSE
BEGIN
-- Logica originale per ROWSTORE
SET @TSQLScripCreationIndex =
'PRINT ''Creazione indice: ' + QUOTENAME(@IndexName) + ' ON ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@TableName) + '(' + @IndexColumns + ')'';' + CHAR(13) +
'CREATE ' + @is_unique + @IndexTypeDesc + ' INDEX ' + QUOTENAME(@IndexName) +
' ON ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@TableName) + '(' + @IndexColumns + ')' +
CASE WHEN @IncludedColumns IS NOT NULL AND @IncludedColumns <> ''
THEN CHAR(13) + 'INCLUDE (' + @IncludedColumns + ')'
ELSE ''
END + CHAR(13) +
'WITH (' + @IndexOptions + ') ON ' + QUOTENAME(@FileGroupName) + ';' + CHAR(13) +
'PRINT ''Indice ' + QUOTENAME(@IndexName) + ' creato su ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@TableName) + ''';';
END
-- Gestione indici disabilitati
IF @is_disabled = 1
BEGIN
SET @TSQLScripDisableIndex =
'ALTER INDEX ' + QUOTENAME(@IndexName) + ' ON ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@TableName) + ' DISABLE;' + CHAR(13) +
'PRINT ''Indice ' + QUOTENAME(@IndexName) + ' disabilitato'';';
END
PRINT @TSQLScripCreationIndex;
IF @TSQLScripDisableIndex <> '' PRINT @TSQLScripDisableIndex;
FETCH NEXT FROM CursorIndex INTO @SchemaName, @TableName, @IndexName, @is_unique, @IndexTypeDesc, @IndexOptions, @is_disabled, @FileGroupName;
END
CLOSE CursorIndex;
DEALLOCATE CursorIndex;
PRINT 'DECLARE @enddate DATETIME2 = getdate();'
PRINT 'SELECT ''Durata esecuzione: '' + CAST(DATEDIFF(SECOND, @startdate, @enddate) AS VARCHAR) + '' secondi'';';
PRINT '/* SALVARE COME CREATE_ALL_INDEX.sql */';
END
GO
USE [Archivio31]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
PRINT '/* SALVARE COME CREATE_ALL_FK.sql */';
CREATE PROCEDURE [dbo].[_Script_CREATE_ALL_FK]
AS
BEGIN
declare @ForeignKeyID int
declare @ForeignKeyName varchar(4000)
declare @ParentTableName varchar(4000)
declare @ParentColumn varchar(4000)
declare @ReferencedTable varchar(4000)
declare @ReferencedColumn varchar(4000)
declare @StrParentColumn varchar(max)
declare @StrReferencedColumn varchar(max)
declare @ParentTableSchema varchar(4000)
declare @ReferencedTableSchema varchar(4000)
declare @TSQLCreationFK varchar(max)
declare CursorFK cursor for select object_id
from sys.foreign_keys
print 'DECLARE @startdate DATETIME2 = getdate(); '
open CursorFK
fetch next from CursorFK into @ForeignKeyID
while (@@FETCH_STATUS=0)
begin
set @StrParentColumn=''
set @StrReferencedColumn=''
declare CursorFKDetails cursor for
select fk.name ForeignKeyName, schema_name(t1.schema_id) ParentTableSchema,
object_name(fkc.parent_object_id) ParentTable, c1.name ParentColumn,schema_name(t2.schema_id) ReferencedTableSchema,
object_name(fkc.referenced_object_id) ReferencedTable,c2.name ReferencedColumn
from sys.foreign_keys fk
inner join sys.foreign_key_columns fkc on fk.object_id=fkc.constraint_object_id
inner join sys.columns c1 on c1.object_id=fkc.parent_object_id and c1.column_id=fkc.parent_column_id
inner join sys.columns c2 on c2.object_id=fkc.referenced_object_id and c2.column_id=fkc.referenced_column_id
inner join sys.tables t1 on t1.object_id=fkc.parent_object_id
inner join sys.tables t2 on t2.object_id=fkc.referenced_object_id
where fk.object_id=@ForeignKeyID
open CursorFKDetails
fetch next from CursorFKDetails into @ForeignKeyName, @ParentTableSchema, @ParentTableName, @ParentColumn, @ReferencedTableSchema, @ReferencedTable, @ReferencedColumn
while (@@FETCH_STATUS=0)
begin
set @StrParentColumn=@StrParentColumn + ', ' + quotename(@ParentColumn)
set @StrReferencedColumn=@StrReferencedColumn + ', ' + quotename(@ReferencedColumn)
fetch next from CursorFKDetails into @ForeignKeyName, @ParentTableSchema, @ParentTableName, @ParentColumn, @ReferencedTableSchema, @ReferencedTable, @ReferencedColumn
end
close CursorFKDetails
deallocate CursorFKDetails
set @StrParentColumn=substring(@StrParentColumn,2,len(@StrParentColumn)-1)
set @StrReferencedColumn=substring(@StrReferencedColumn,2,len(@StrReferencedColumn)-1)
set @TSQLCreationFK='print ''cancellazione foreign key da tabella ' + QUOTENAME(@ParentTableName) + ''';
ALTER TABLE '+quotename(@ParentTableSchema)+'.'+quotename(@ParentTableName)+' WITH CHECK ADD CONSTRAINT '+quotename(@ForeignKeyName)
+ ' FOREIGN KEY('+ltrim(@StrParentColumn)+') '+ char(13) +'REFERENCES '+quotename(@ReferencedTableSchema)+'.'+quotename(@ReferencedTable)+' ('+ltrim(@StrReferencedColumn)+') ' + char(13)+''
print @TSQLCreationFK
fetch next from CursorFK into @ForeignKeyID
end
close CursorFK
deallocate CursorFK
print ' DECLARE @enddate DATETIME2 = getdate();
SELECT ''esecuzione processo durata minuti: ''+ cast(DATEDIFF(minute, @startdate, @enddate) as varchar); '
PRINT '/* SALVARE COME CREATE_ALL_FK.sql */';
END
GO
USE [Archivio31]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[_Script_DROP_ALL_PK_UNIQUECONSTRAINTS]
AS
BEGIN
DECLARE @SchemaName VARCHAR(256)
DECLARE @TableName VARCHAR(256)
DECLARE @IndexName VARCHAR(256)
DECLARE @TSQLDropIndex VARCHAR(MAX)
DECLARE CursorIndexes CURSOR FOR
SELECT schema_name(t.schema_id), t.name, i.name
FROM sys.indexes i
INNER JOIN sys.tables t ON t.object_id= i.object_id
WHERE i.type>0 and t.is_ms_shipped=0 and t.name<>'sysdiagrams'
and (is_primary_key=1 or is_unique_constraint=1)
print 'DECLARE @startdate DATETIME2 = getdate(); '
OPEN CursorIndexes
FETCH NEXT FROM CursorIndexes INTO @SchemaName,@TableName,@IndexName
WHILE @@fetch_status = 0
BEGIN
SET @TSQLDropIndex = 'print ''cancellazione pk da tabella ' + QUOTENAME(@TableName) + ''';
IF (OBJECT_ID('''+QUOTENAME(@SchemaName)+ '.' +QUOTENAME(@IndexName)+''', ''PK'') IS NOT NULL)
BEGIN
ALTER TABLE '+QUOTENAME(@SchemaName)+ '.' + QUOTENAME(@TableName) + ' DROP CONSTRAINT ' +QUOTENAME(@IndexName) +'
END;
print ''chiave ' +QUOTENAME(@IndexName) +' da tabella ' + QUOTENAME(@TableName) + ' cancellata'';
'
PRINT @TSQLDropIndex
FETCH NEXT FROM CursorIndexes INTO @SchemaName,@TableName,@IndexName
END
CLOSE CursorIndexes
DEALLOCATE CursorIndexes
print ' DECLARE @enddate DATETIME2 = getdate();
SELECT ''esecuzione processo durata minuti: ''+ cast(DATEDIFF(minute, @startdate, @enddate) as varchar); '
PRINT '/* SALVARE COME DROP_ALL_PK_UNIQUECONSTRAINTS.sql */';
END
GO
USE [Archivio31]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[_Script_DROP_ALL_INDEX]
AS
BEGIN
DECLARE @SchemaName VARCHAR(256)DECLARE @TableName VARCHAR(256)
DECLARE @IndexName VARCHAR(256)
DECLARE @TSQLDropIndex VARCHAR(MAX)
DECLARE CursorIndexes CURSOR FOR
SELECT schema_name(t.schema_id), t.name, i.name
FROM sys.indexes i
INNER JOIN sys.tables t ON t.object_id= i.object_id
WHERE i.type>0 and t.is_ms_shipped=0 and t.name<>'sysdiagrams'
and (is_primary_key=0 and is_unique_constraint=0)
print 'DECLARE @startdate DATETIME2 = getdate(); '
OPEN CursorIndexes
FETCH NEXT FROM CursorIndexes INTO @SchemaName,@TableName,@IndexName
WHILE @@fetch_status = 0
BEGIN
SET @TSQLDropIndex = 'print ''cancellazione indici da tabella ' + QUOTENAME(@TableName) + ''';
DROP INDEX '+QUOTENAME(@SchemaName)+ '.' + QUOTENAME(@TableName) + '.' +QUOTENAME(@IndexName) +';
print ''indice ' +QUOTENAME(@IndexName) +' da tabella ' + QUOTENAME(@TableName) + ' cancellato'';
'
PRINT @TSQLDropIndex
FETCH NEXT FROM CursorIndexes INTO @SchemaName,@TableName,@IndexName
END
CLOSE CursorIndexes
DEALLOCATE CursorIndexes
print ' DECLARE @enddate DATETIME2 = getdate();
SELECT ''esecuzione processo durata minuti: ''+ cast(DATEDIFF(minute, @startdate, @enddate) as varchar); '
PRINT '/* SALVARE COME DROP_ALL_INDEX.sql */';
END
GO
/*parametri pulizia */
insert into [Archivio31].[dbo].[BKP_configurazione] (Parametro , valore, Configurazione) values
('data','20230101',''),
('tabella','ArticoliValori','where isnull(adata,getdate())>=(select valore from [Archivio_origine].[dbo].[BKP_configurazione] where parametro=''data'')'),
('tabella','ArticoliMovimenti','where iddocumento in (select IDDocumento from [Archivio_origine].[dbo].[BKP_IDDocumento])'),
('tabella','Audit','where data>=(select valore from [Archivio_origine].[dbo].[BKP_configurazione] where parametro=''data'')')
Creo una copia di sicurezza del database e per creare una copia di destinazione
lancio le seguenti stored procedure e salvo ordinatamente i risultati cercando di nominare gli script generati con nomi che richiamano allo script generante. perchè serviranno in un secondo momento
exec _Script_CREATE_ALL_FK;
exec _Script_CREATE_ALL_INDEX;
exec _Script_CREATE_ALL_PK_UNIQUECONSTRAINTS;
exec _Script_DROP_ALL_FK;
exec _Script_DROP_ALL_PK_UNIQUECONSTRAINTS;
exec _Script_DROP_ALL_INDEX;
/*disable TRIGGER all*/
SELECT
'ALTER TABLE [Archivio31_new].[dbo].[' + tab.name+'] DISABLE TRIGGER ALL; '
FROM sysobjects tab
WHERE 1=1 and tab.xtype = 'U' AND tab.name not like 'BKP_%'
/*truncate table all */
SELECT ' truncate table [Archivio31_new].[dbo].[' + tab.name+']; ' 'tronco'
FROM sysobjects tab
WHERE 1=1 and tab.xtype = 'U' AND tab.name not like 'BKP_%' AND tab.name not like '__PKIX'
ORDER BY 1
lancio gli script creati in precedenza per preparare il database di destinazione
Dopo aver completato le procedure per prepararate il processo di pulizia ora siamo arrivati al punto critico. Ora il database è stato messo offline e tutti i processi sono fermi. Da ora i dati presenti sono fermi e veranno migrati esclusivamente i dati storici uguali o successivi alla data di pulizia e quelli delle tabelle operative.
originariamente qui si inserivano i tati relativi alledate da cancellare ma sono stati anticipati subito prima della copia del db in modo da poter avere le date anche sun nuovo database per i futuri controlli
/*parametri pulizia SCOUT like */
insert into [Archivio_origine].[dbo].[BKP_configurazione] (Parametro , valore, Configurazione)
SELECT 'tabella' as parametro, tab.name AS valore,
'where data>=(select valore from [Archivio_origine].[dbo].[BKP_configurazione] where parametro=''data'')' as configurazione
FROM sysobjects tab WHERE 1=1 and tab.xtype = 'U' AND tab.name in ('TempBelgiumzeb','TempBellu','TempModa','TempPapavero','TempRetail','TempScout','TempSimon')
ORDER BY tab.name ;
/*inserisco la giacenza */
INSERT INTO [Archivio_origine].[dbo].[BKP_giacenze] (NEW_IDDocumentocontatore,IDArticolo,Quantità,IDAnagrafica)
select newid(), idarticolo,sum(movgiacenza) ,idanagrafica from [Archivio_origine].[dbo].ArticoliMovimenti am
where datamov<(select valore from [Archivio_origine].[dbo].[BKP_configurazione] where parametro='data')
group by idanagrafica,idarticolo having sum(movgiacenza)<>0
/*intesto un IDdocumento per ogni Anagrafica */
use [Archivio_origine]
declare @idanagrafica varchar(20)
DECLARE @conteggio INT
DECLARE @newdocumento uniqueidentifier
SET @conteggio = (select count(*) conteggio from BKP_giacenze where NEW_IDDocumento is null)
WHILE (@conteggio >=1)
BEGIN
select top 1 @idanagrafica=idanagrafica ,@newdocumento=newid() from BKP_giacenze where NEW_IDDocumento is null
update BKP_giacenze set NEW_iddocumento=@newdocumento where idanagrafica=@idanagrafica
SET @conteggio = (select count(*) conteggio from BKP_giacenze where NEW_IDDocumento is null)
END
/*splitta giacenze smallint */
declare @idanagrafica1 uniqueidentifier
DECLARE @conteggio1 INT
DECLARE @multiplicatore INT
DECLARE @newdocumento1 uniqueidentifier
SET @conteggio1 = (select count(*) conteggio from BKP_giacenze where Quantità>32000 or Quantità<-32000)
WHILE (@conteggio1 >=1)
BEGIN
select top 1 @idanagrafica1=NEW_IDDocumentocontatore ,@multiplicatore=(case when quantità>1 then 32000 else -32000 end) ,@newdocumento1=newid() from BKP_giacenze where Quantità>32000 or Quantità<-32000
insert into [Archivio_origine].[dbo].[BKP_giacenze] (NEW_IDDocumento, NEW_IDDocumentocontatore, idarticolo, quantità, IDAnagrafica)
select NEW_IDDocumento, newid(), idarticolo, quantità-@multiplicatore, IDAnagrafica from BKP_giacenze where NEW_IDDocumentocontatore=@idanagrafica1
update BKP_giacenze set quantità=@multiplicatore where NEW_IDDocumentocontatore=@idanagrafica1
SET @conteggio1 = (select count(*) conteggio from BKP_giacenze where Quantità>32000 or Quantità<-32000)
END
/*inserisco id documenti da salvare */
insert into [Archivio_origine].[dbo].[BKP_IDDocumento] (IDDocumento)
select iddocumento from [Archivio_origine].[dbo].[StoricoDocumentoParametri]
where iddocumento in ((select iddocumento from [Archivio_origine].[dbo].[storicodocumentoparametri]
where data>=(select valore from [Archivio_origine].[dbo].[BKP_configurazione] where parametro='data' ))
union (select '00000000-0000-0000-0000-000000000000'))
/*inserisco in configurazione i filtri relativi agli storici*/
insert into [Archivio_origine].[dbo].[BKP_configurazione] (Parametro , valore, Configurazione)
SELECT 'tabella' as parametro, tab.name AS valore,
' where iddocumento in (select iddocumento from [Archivio_origine].[dbo].[BKP_IDDocumento])' as configurazione
FROM sysobjects tab WHERE 1=1 and tab.xtype = 'U' AND tab.name like 'storicodocumento%' and tab.name<>'StoricoDocumentoPagamenti'
ORDER BY tab.name ;
/*CopiaTabelle */
print 'DECLARE @orainizio DATETIME2 = getdate();
DECLARE @startdate DATETIME2;
DECLARE @enddate DATETIME2;';
(SELECT tab.name AS tabella
,case when tab.name in (select valore from BKP_configurazione where Parametro='tabella') then (select configurazione from BKP_configurazione where valore=tab.name) else '' end as filtri
,' truncate table [Archivio31_new].[dbo].[' + tab.name+'] ' 'tronco',
'set @startdate=getdate();'+
'print ''inizio copia [' + tab.name+'] ''+convert(varchar ,@startdate,24); '+
'ALTER TABLE [Archivio31_new].[dbo].[' + tab.name+'] DISABLE TRIGGER ALL; '+
case isnull((select top 1 1 from syscolumns campi WHERE tab.id = campi.id and colstat=1),0) when 1 then 'SET IDENTITY_INSERT [Archivio31_new].[dbo].[' + tab.name+'] ON; ' else '' end
+'insert into '+'[Archivio31_new].[dbo].['+tab.name+'] (' +
(select stuff((SELECT ',['+campi.name+']' FROM syscolumns campi WHERE tab.id = campi.id and campi.iscomputed<>1 order by campi.colorder,1 for xml path('')), 1, 1, ''))
+') select '
+(select stuff((SELECT ',['+campi.name+']' FROM syscolumns campi WHERE tab.id = campi.id and campi.iscomputed<>1 order by campi.colorder,1 for xml path('')), 1, 1, ''))
+ ' from [Archivio_origine].[dbo].[' + tab.name+'] '
+ case when tab.name in (select valore from BKP_configurazione where Parametro='tabella') then (select configurazione from BKP_configurazione where valore=tab.name) else '' end
+' ;' + case isnull((select top 1 1 from syscolumns campi WHERE tab.id = campi.id and colstat=1),0) when 1 then 'SET IDENTITY_INSERT [Archivio31_new].[dbo].[' + tab.name+'] OFF ; ' else '' end
+'set @enddate=getdate();'
+'print ''Fine copia [' + tab.name+'] ''+convert(varchar ,@enddate,24); '
+'print ''esecuzione copia [' + tab.name+'] durata minuti: ''+ cast(DATEDIFF(minute, @startdate, @enddate) as varchar);'
'copia tab'
,'ALTER TABLE [Archivio31_new].[dbo].[' + tab.name+'] ENABLE TRIGGER ALL; ' 'riabilita trigger'
FROM sysobjects tab
WHERE 1=1 and tab.xtype = 'U' AND tab.name not like 'BKP_%' AND tab.name not like '__PKIX' )
ORDER BY 1
print '
DECLARE @orafine DATETIME2 = getdate();
print ''esecuzione processo durata minuti: ''+ cast(DATEDIFF(minute, @orainizio, @orafine) as varchar);
';
/*COPIA_TABELLE_ALL */
DECLARE @orainizio DATETIME2 = getdate();
DECLARE @startdate DATETIME2;
DECLARE @enddate DATETIME2;
--copia qui "copia tab"
DECLARE @orafine DATETIME2 = getdate();
print 'esecuzione processo durata minuti: '+ cast(DATEDIFF(minute, @orainizio, @orafine) as varchar);
Eseguo il codice seguente per inserire nel nuovo database dei documenti di giacenza iniziale con le quantità del giorno ultimo eliminato
/*copiaGiacenzeIniziali */
DECLARE @orainizio DATETIME2 = getdate();
DECLARE @startdate DATETIME2;
DECLARE @enddate DATETIME2;
print 'inizio copia [ArticoliMovimenti] '+convert(varchar ,getdate(),24); ALTER TABLE [Archivio31_new].[dbo].[ArticoliMovimenti] DISABLE TRIGGER ALL;
insert [Archivio31_new].[dbo].[ArticoliMovimenti] (IDDocumento,IDDocumentoContatore,IDAnagrafica,IDArticolo,Quantità,MovGiacenza,MovLanciato,MovOrdinato,MovEsterno,MovReso,MovAcquistato,MovVenduto,MovImpegnato,MovBloccato,IDAnagraficaMov,IDTipoMov,AbbrTipoMov,NumeroMov,DataMov,DataOraMov,FlagMovLocale,Valore_Prezzo)
select NEW_IDDocumento,NEW_IDDocumentocontatore,IDAnagrafica,IDArticolo,Quantità,Quantità,0,0,0,0,0,0,0,0,'',(select configurazione from [Archivio_origine].[dbo].[TabSystemConfig] where Parametro='TipoDocumentoGiacenzeIniziali'),'giacIniziale',0
--,convert(varchar,(select dateadd(dd,-1,valore) from [Archivio_origine].[dbo].[BKP_configurazione] where parametro='data'),101)
,(select dateadd(dd,-1,valore) from [Archivio_origine].[dbo].[BKP_configurazione] where parametro='data')
,(select dateadd(dd,-1,valore) from [Archivio_origine].[dbo].[BKP_configurazione] where parametro='data'),1,0
from [Archivio_origine].[dbo].[BKP_giacenze] ;
print 'Fine copia [ArticoliMovimenti] '+convert(varchar ,getdate(),24);
print 'inizio copia [StoricoDocumento] '+convert(varchar ,getdate(),24); ALTER TABLE [Archivio31_new].[dbo].[StoricoDocumento] DISABLE TRIGGER ALL;
INSERT INTO [Archivio31_new].[dbo].[StoricoDocumento] (IDDocumento,IDDocumentoContatore,IDArticolo,Quantità,DataArticolo)
select distinct NEW_IDDocumento,NEW_IDDocumentocontatore,idarticolo,Quantità,(select dateadd(dd,-1,(select valore from [Archivio_origine].[dbo].[BKP_configurazione] where parametro='data'))) from [Archivio_origine].[dbo].[BKP_giacenze]
print 'Fine copia [StoricoDocumento] '+convert(varchar ,getdate(),24);
print 'inizio copia [StoricoDocumentoParametri] '+convert(varchar ,getdate(),24); ALTER TABLE [Archivio31_new].[dbo].[StoricoDocumentoParametri] DISABLE TRIGGER ALL;
INSERT INTO [Archivio31_new].[dbo].[StoricoDocumentoParametri] (IDDocumento,IDAnagraficabase,TipoDocumento,GruppoNumerazione,Data,DataCreazione,Numero,IDOperatore,Anno,RAS_Spedito)
select distinct NEW_IDDocumento ,IDAnagrafica ,(SELECT Configurazione FROM [Archivio_origine].[dbo].TabSystemConfig WHERE Parametro='TipoDocumentoGiacenzeIniziali') ,(SELECT Configurazione FROM [Archivio_origine].[dbo].TabSystemConfig WHERE Parametro='TipoDocumentoGiacenzeIniziali') ,(select dateadd(dd,-1,(select valore from [Archivio_origine].[dbo].[BKP_configurazione] where parametro='data')) ) data ,GetDate() ,0 ,'ANDREI' ,year((select dateadd(dd,-1,(select valore from [Archivio_origine].[dbo].[BKP_configurazione] where parametro='data')) )) ,0
from [Archivio_origine].[dbo].[BKP_giacenze];
print 'Fine copia [StoricoDocumentoParametri] '+convert(varchar ,getdate(),24);
DECLARE @orafine DATETIME2 = getdate();
print 'esecuzione processo durata minuti: '+ cast(DATEDIFF(minute, @orainizio, @orafine) as varchar);
/*ControlloGiacenze*/
select idarticolo ,idanagrafica ,sum(movgiacenza) - (select sum(movgiacenza) from [Archivio31_new].[dbo].[ArticoliMovimenti] am2 where am2.idarticolo=am1.idarticolo and am2.idanagrafica=am1.idanagrafica )
from [Archivio_origine].[dbo].[ArticoliMovimenti] am1
group by idanagrafica,idarticolo having sum(movgiacenza) - (select sum(movgiacenza) from [Archivio31_new].[dbo].[ArticoliMovimenti] am2 where am2.idarticolo=am1.idarticolo and am2.idanagrafica=am1.idanagrafica )<>0;
select idarticolo ,idanagrafica ,sum(movgiacenza) - (select sum(movgiacenza) from [Archivio31_new].[dbo].[ArticoliMovimenti] am1 where am2.idarticolo=am1.idarticolo and am2.idanagrafica=am1.idanagrafica )
from [Archivio_origine].[dbo].[ArticoliMovimenti] am2
group by idanagrafica,idarticolo having sum(movgiacenza) - (select sum(movgiacenza) from [Archivio31_new].[dbo].[ArticoliMovimenti] am1 where am2.idarticolo=am1.idarticolo and am2.idanagrafica=am1.idanagrafica )<>0;
select idarticolo ,idanagrafica ,sum(movgiacenza) - (select sum(movgiacenza) from [Archivio_origine].[dbo].[ArticoliMovimenti] am2 where am2.idarticolo=am1.idarticolo and am2.idanagrafica=am1.idanagrafica )
from [Archivio31_new].[dbo].[ArticoliMovimenti] am1
group by idanagrafica,idarticolo having sum(movgiacenza) - (select sum(movgiacenza) from [Archivio_origine].[dbo].[ArticoliMovimenti] am2 where am2.idarticolo=am1.idarticolo and am2.idanagrafica=am1.idanagrafica )<>0;
select idarticolo ,idanagrafica ,sum(movgiacenza) - (select sum(movgiacenza) from [Archivio_origine].[dbo].[ArticoliMovimenti] am1 where am2.idarticolo=am1.idarticolo and am2.idanagrafica=am1.idanagrafica )
from [Archivio31_new].[dbo].[ArticoliMovimenti] am2
group by idanagrafica,idarticolo having sum(movgiacenza) - (select sum(movgiacenza) from [Archivio_origine].[dbo].[ArticoliMovimenti] am1 where am2.idarticolo=am1.idarticolo and am2.idanagrafica=am1.idanagrafica )<>0;
select idanagrafica, sum(q) from
((
select idanagrafica ,sum(movgiacenza) q
from [Archivio31_new].[dbo].[ArticoliMovimenti] am2
group by idanagrafica having sum(movgiacenza) <>0
) union all (
select idanagrafica ,sum(-movgiacenza) q
from [Archivio_origine].[dbo].[ArticoliMovimenti] am2
group by idanagrafica having sum(movgiacenza) <>0
)) as pippo
group by idanagrafica
lancio la seguente query e copio il risultato della colonna New_query come nuova query sostituendo l'union finale con un order by record desc
/*DateRestanti*/
Select Distinct TABLE_SCHEMA,TABLE_NAME,TABLE_CATALOG,COLUMN_NAME
,DATA_TYPE
,'(select '''+TABLE_NAME+''' tabella, '''+COLUMN_NAME+''' campo, count(*) record , ''delete '+TABLE_NAME+' where '+COLUMN_NAME+'<''''20220101'''' '' elimina from '+TABLE_NAME+' where '+COLUMN_NAME+'<''20220101'') union ' New_query
from INFORMATION_SCHEMA.COLUMNS
Where 1=1
AND TABLE_NAME not in (select valore from BKP_configurazione where Parametro='tabella')
and TABLE_NAME not like 'TempArticoli_%'
AND NOT TABLE_NAME LIKE 'temp%'
AND NOT TABLE_NAME LIKE '%Files'
AND TABLE_NAME NOT IN ('Anagrafica','StoricoDocumento','StoricoDocumentoParametri','ArticoliLocale','TabStatistiche',
'StoricoDocumentoParametriAgg','RAS_StoricoDocumentoParametri','RAS_StoricoDocumento','TabNazioniExtraSogliaFatturato',
'TabSysMacchine','ImportXlsMagento','AnagraficaVarListini','I24_Anag','TabSysScheduler')
and DATA_TYPE='datetime'
Porobabilmente non leggero la mail almeno per il periodo di test del sito ma puoi provare a inviare