miércoles, 10 de abril de 2019

MS Access - Run-time error 3000 - Reserved error (-7711) - SQL Server

Recientemente me he encontrado con este error es MS Access:

MS Access - Run-time error '3000' - Reserved error (-7171), there is no message for this error



Una posible causa a este problema puede ser el espacio de la base de datos. En mi caso, había llegado a la restricción de SQL Server Express. El detalle del error podía verse en el visor de sucesos de Windows:

CREATE DATABASE or ALTER DATABASE failed because the resulting cumulative database size would exceed your licensed limit of 10240 MB per database.

Algunas opciones para hacer espacio:

Log de transacciones

USE mibase
GO
ALTER DATABASE mibase
SET RECOVERY SIMPLE;
GO
DBCC SHRINKFILE ( mibase  _log, 1);
GO
ALTER DATABASE mibase
SET RECOVERY FULL;

Revisar espacio en MSDB

sp_helpdb msdb 



La siguiente consulta nos puede ayudar con el tamaño de las tablas.

select
    object_name(i.object_id) as ObjectName,
    i.[name] as IndexName,
    sum(a.total_pages) as TotalPages,
    sum(a.used_pages) as UsedPages,
    sum(a.data_pages) as DataPages,
    (sum(a.total_pages) * 8) / 1024 as TotalSpaceMB,
    (sum(a.used_pages) * 8) / 1024 as UsedSpaceMB, 
    (sum(a.data_pages) * 8) / 1024 as DataSpaceMB
from
    sys.indexes i
    inner join sys.partitions p 
        on i.object_id = p.object_id and i.index_id = p.index_id
    inner join sys.allocation_units a
        on p.partition_id = a.container_id
group by
    i.object_id, 
    i.index_id, 
    i.[name]
order by
    sum(a.total_pages) desc, 
    object_name(i.object_id)
go



Si el problema es de DataBase Mail, se pueden usar estos procedimientos (no usar truncate):

EXECUTE msdb.dbo.sysmail_delete_mailitems_sp @sent_before = 'October 9, 2005' ; GO 

EXECUTE msdb.dbo.sysmail_delete_log_sp  @logged_before = 'October 9, 2005' ;  
GO 

Usar con cuidado si tenemos muchos elementos para eliminar. Jugar con los rangos de fechas.
Es posible que se requiera posteriormente hacer un Shrink:



viernes, 29 de marzo de 2019

sp_send_dbmail - Attachment File is invalid

Cuando ejecutamos dbo.sp_send_dbmail dentro de un bloque de control de errores, observamos que el siguiente error no es capturado dentro del CATCH:

Msg 22051, Level 16, State 1, Line 0
Attachment file C:\test.xls is invalid.  

Una posible solución a este problema es controlar la existencia de los archivos antes de enviar el correo con xp_fileexist 

Ejemplo de código:

DECLARE @Attachments VARCHAR(MAX)
DECLARE @Attachment VARCHAR(8000)
DECLARE @AttachmentValid INT
DECLARE @DetailError VARCHAR(MAX)

SET @Attachments = 'a;sdf;32;34;3434'
SET @DetailError = ''

WHILE len(@Attachments) > 0
BEGIN
     SET @Attachment = left(@Attachments, charindex(';', @Attachments+';')-1)
     EXEC master.dbo.xp_fileexist @Attachment, @AttachmentValid OUTPUT  
     IF @AttachmentValid = 0 SET @DetailError = @DetailError + '[' + @Attachment + '] no es válido. '
     SET @Attachments = stuff(@Attachments, 1, charindex(';', @Attachments+';'), '')
END