Falla el xp_cmdshell

20/07/2005 - 15:27 por Pao | Informe spam
Toy trabajando con SQLServer 2000 y sp3.
Necesito hacer una depuración de unas tablas y a la vez de unos archivos
fisicos, (las rutas están almacenadas en una tabla) pero el script aunque no
te indica explicitamente que falla observas que realmente no borra los
archivos fisicos, de lo que veo sucede que el archivo tiene una ruta que el
comando "del" en el xp_cmdshell no entiende, y es \\

Adjunto la parte que falla:

DECLARE @VAR_RECFILENAME AS VARCHAR(125)
DECLARE @Comando AS VARCHAR(150)
DECLARE @Result int
SET @Comando = 'DEL ' + @VAR_RECFILENAME
set @VAR_RECFILENAME=
'c:\\RECORDINGS\IR100000\IR200946\RecordedCall2A00001220.wav'
EXEC master..xp_cmdshell @Comando



Este es el script completo:(Para que me hagan otras recomendaciones) Mcuhas
gracias.

USE CallRecordings
GO

/*
Inicio de depuracion de archivos

Declaracion de variables
Aqui se debe definir la fecha limite hasta donde se borraran los datos
La fecha es almacendada en la variable @dt_Fecha_Lim
La fecha debe definirse bajo el formato 'AAAA-MM-DD HH:MM:SS.MMM'
*/

DECLARE @VAR_RECID AS VARCHAR(20)
declare @w_limite as int
declare @w_cuenta as int
DECLARE @VAR_RECFILENAME AS VARCHAR(125)
DECLARE @dt_Fecha_Lim AS DATETIME
DECLARE @Comando AS VARCHAR(150)
DECLARE @Result int

select @w_limite = 5000
select @w_cuenta = 0
set rowcount @w_limite


/*SET @dt_Fecha_Lim = '1900-12-30 00:00:00.000' -- Cambiar aqui el valor de
Fecha Limite*/
select @dt_fecha_lim = dateadd(m,-12,getdate())




PRINT 'Iniciando depuracion de tablas con Fecha limite: ' +
convert(varchar(20),@dt_Fecha_Lim)

PRINT 'Seleccion de registros para depuracion Tabla I3_RecordingData...'


DECLARE recordingdata_cursor cursor for

SELECT recordingid, recordingfilename FROM
I3_RECORDINGDATA WHERE RECORDINGDATE <= @dt_Fecha_Lim


OPEN recordingdata_cursor
FETCH NEXT FROM recordingdata_cursor INTO @VAR_RECID,@VAR_RECFILENAME
WHILE @@FETCH_STATUS = 0 and (@w_cuenta < @w_limite)


BEGIN


DELETE FROM I3_ARCHIVEWORK WHERE RECORDINGID=@VAR_RECID
DELETE FROM I3_IMPORTRULES WHERE RECORDINGID=@VAR_RECID
DELETE FROM I3_RECORDINGAUDIT WHERE RECORDINGID=@VAR_RECID
DELETE FROM I3_RECORDINGERRORS WHERE RECORDINGID=@VAR_RECID
DELETE FROM I3_RECORDINGFILTERS WHERE RECORDINGID=@VAR_RECID

@VAR_RECFILENAME

PRINT 'Borrando el archivo Fisico: ' + @VAR_RECFILENAME
SET @Comando = 'DEL ' + @VAR_RECFILENAME
EXEC @Result=master..xp_cmdshell @Comando

IF (@Result=0)
BEGIN
PRINT ' '
PRINT 'Archivo: ' + @VAR_RECFILENAME + ' borrado Exitosamente.'
END
ELSE
BEGIN
PRINT ' '
PRINT 'Fallo al borrar el archivo: ' + @VAR_RECFILENAME
END



select @w_cuenta = @w_cuenta +1
select @w_cuenta

FETCH NEXT FROM recordingdata_cursor INTO @VAR_RECID,@VAR_RECFILENAME
END

PRINT 'Fin de Depuracion en Cascada de Tablas..'



CLOSE recordingdata_cursor
DEALLOCATE recordingdata_cursor


PRINT ' '
PRINT 'Depurando tabla I3_RECORDINGDATA...'
PRINT ' '
DELETE FROM I3_RECORDINGDATA WHERE RECORDINGDATE <= @dt_Fecha_Lim
PRINT ' '


PRINT ' '
PRINT 'Fin de depuracion de tablas'
go
 

Leer las respuestas

#1 Alejandro Mesa
20/07/2005 - 15:51 | Informe spam
Pao,

set @VAR_RECFILENAME=
'c:\\RECORDINGS\IR100000\IR200946\RecordedCall2A00001220.wav'



Por que ponen dos veces el caracter "\". Si en el sistema operativo pruebas
el comando:

c:\> dir c:\\RECORDINGS\IR100000\IR200946\RecordedCall2A00001220.wav

te dara un error.


AMB

"Pao" wrote:

Toy trabajando con SQLServer 2000 y sp3.
Necesito hacer una depuración de unas tablas y a la vez de unos archivos
fisicos, (las rutas están almacenadas en una tabla) pero el script aunque no
te indica explicitamente que falla observas que realmente no borra los
archivos fisicos, de lo que veo sucede que el archivo tiene una ruta que el
comando "del" en el xp_cmdshell no entiende, y es \\

Adjunto la parte que falla:

DECLARE @VAR_RECFILENAME AS VARCHAR(125)
DECLARE @Comando AS VARCHAR(150)
DECLARE @Result int
SET @Comando = 'DEL ' + @VAR_RECFILENAME
set @VAR_RECFILENAME=
'c:\\RECORDINGS\IR100000\IR200946\RecordedCall2A00001220.wav'
EXEC master..xp_cmdshell @Comando



Este es el script completo:(Para que me hagan otras recomendaciones) Mcuhas
gracias.

USE CallRecordings
GO

/*
Inicio de depuracion de archivos

Declaracion de variables
Aqui se debe definir la fecha limite hasta donde se borraran los datos
La fecha es almacendada en la variable @dt_Fecha_Lim
La fecha debe definirse bajo el formato 'AAAA-MM-DD HH:MM:SS.MMM'
*/

DECLARE @VAR_RECID AS VARCHAR(20)
declare @w_limite as int
declare @w_cuenta as int
DECLARE @VAR_RECFILENAME AS VARCHAR(125)
DECLARE @dt_Fecha_Lim AS DATETIME
DECLARE @Comando AS VARCHAR(150)
DECLARE @Result int

select @w_limite = 5000
select @w_cuenta = 0
set rowcount @w_limite


/*SET @dt_Fecha_Lim = '1900-12-30 00:00:00.000' -- Cambiar aqui el valor de
Fecha Limite*/
select @dt_fecha_lim = dateadd(m,-12,getdate())




PRINT 'Iniciando depuracion de tablas con Fecha limite: ' +
convert(varchar(20),@dt_Fecha_Lim)

PRINT 'Seleccion de registros para depuracion Tabla I3_RecordingData...'


DECLARE recordingdata_cursor cursor for

SELECT recordingid, recordingfilename FROM
I3_RECORDINGDATA WHERE RECORDINGDATE <= @dt_Fecha_Lim


OPEN recordingdata_cursor
FETCH NEXT FROM recordingdata_cursor INTO @VAR_RECID,@VAR_RECFILENAME
WHILE @@FETCH_STATUS = 0 and (@w_cuenta < @w_limite)


BEGIN


DELETE FROM I3_ARCHIVEWORK WHERE RECORDINGID=@VAR_RECID
DELETE FROM I3_IMPORTRULES WHERE RECORDINGID=@VAR_RECID
DELETE FROM I3_RECORDINGAUDIT WHERE RECORDINGID=@VAR_RECID
DELETE FROM I3_RECORDINGERRORS WHERE RECORDINGID=@VAR_RECID
DELETE FROM I3_RECORDINGFILTERS WHERE RECORDINGID=@VAR_RECID

@VAR_RECFILENAME

PRINT 'Borrando el archivo Fisico: ' + @VAR_RECFILENAME
SET @Comando = 'DEL ' + @VAR_RECFILENAME
EXEC @Result=master..xp_cmdshell @Comando

IF (@Result=0)
BEGIN
PRINT ' '
PRINT 'Archivo: ' + @VAR_RECFILENAME + ' borrado Exitosamente.'
END
ELSE
BEGIN
PRINT ' '
PRINT 'Fallo al borrar el archivo: ' + @VAR_RECFILENAME
END



select @w_cuenta = @w_cuenta +1
select @w_cuenta

FETCH NEXT FROM recordingdata_cursor INTO @VAR_RECID,@VAR_RECFILENAME
END

PRINT 'Fin de Depuracion en Cascada de Tablas..'



CLOSE recordingdata_cursor
DEALLOCATE recordingdata_cursor


PRINT ' '
PRINT 'Depurando tabla I3_RECORDINGDATA...'
PRINT ' '
DELETE FROM I3_RECORDINGDATA WHERE RECORDINGDATE <= @dt_Fecha_Lim
PRINT ' '


PRINT ' '
PRINT 'Fin de depuracion de tablas'
go

Preguntas similares