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

Preguntas similare

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

Respuesta Responder a este mensaje
#2 Pao
20/07/2005 - 17:23 | Informe spam
Lo que pasa es que así graba el aplicativo. Pero que truquito puedo hacer a
nivel de script o query para arreglarlo??

"Alejandro Mesa" wrote:

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
>
Respuesta Responder a este mensaje
#3 Alejandro Mesa
20/07/2005 - 21:17 | Informe spam
Pao,

Si camino no contiene nombres UNC, entonces pudieras reemplazar los
backslach dobles por uno sencillo.

> > SET @Comando = 'DEL ' + @VAR_RECFILENAME



SET @Comando = 'DEL ' + replace(@VAR_RECFILENAME, '\\', '\')
...

What is UNC?
http://kb.iu.edu/data/aibg.html


AMB

"Pao" wrote:

Lo que pasa es que así graba el aplicativo. Pero que truquito puedo hacer a
nivel de script o query para arreglarlo??

"Alejandro Mesa" wrote:

> 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
> >
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida