Ejecutar sentencias T-SQL de SQL Server 2008 en CmdExec

Ejecutar sentencias T-SQL de SQL Server 2008 en CmdExec

Buenas tardes,

Les comento un problemita en estos momentos, si me pueden ayudar sería genial.

Tengo creado un trabajo en SQL Server 2008, este trabajo esta creado bajo el Agente de SQL Server. En uno de los pasos de este trabajo ejecuto algunas sentencias del sistema operativo (CmdExec), pero dentro de ese paso necesito consultar una tabla de mi base de datos; es decir, necesito ejecutar una sentencia T-SQL, pero no sé combinar las dos tipos de consultas.

He hecho trabajos en el Agente de SQL Server donde el tipo de sentencia es T-SQL y desde allí puedes invocar sentencia del Sistema operativo por medio de la sentencia "EXEC master..xp_cmdshell", lo contario no es posible?.

Espero que me puedan ayudar.

Saludos,


Comentarios

Hola a todos

Soy nuevo en el uso de sentencias de SQL y necesito crear un reporte que me arroje una estadística, esto es, que me haga un conteo de registros por los campos de programa, grado y sexo.
Como ejemplo les daría lo siguiente:
Es necesario saber cuantos hombres y cuantas mujeres están en primer grado de cada programa, cuantos en segundo grado cuantos en tercero y así sucesivamente, teniendo en cuenta que hay 10 programas y en cada programa 6 grados.

Espero me pudieran orientar en donde ver sentencias de muestras o algún manual en donde lo pueda sacar.

Gracias
luis aguilar

Luis que tal !, mira podes probar con las clausulas GROUP BY, COUNT, HAVING. Te paso un ejemplo sencillo para que puedas avanzar:

select Grado, count(Grado) as CantAlumnos
from .dbo.TablaAlumnos
group by Grado
order by Grado

Contame luego !.

Hola Ramorjo como estas !, lo contrario puede hacerse. Necesitas generar un archivo del tipo cmd, con variables para guardar los resultados e invocar la consulta al SQL Server, utilizando la herramienta sqlcmd.
Pon especial atención a los seteos de entorno de la herramienta sqlcmd, pues puedes llamar script (*.sql) o bien directamente ejecutar el query (-Q"Select * from mitabla").

Saludos,

JuanPLG


Hola JuanPLG, gracias por responder.

He estado validando información de sqlcmd pero no puedo generar archivos tipo cmd o .sql que estén externos a mi servidor SQL Server 2008, sino que todo el código debe quedar en el Agente de Trabajo SQL Server, es por eso que estaba tratando de incluir todo en un mismo paso del trabajo que estoy haciendo, pero no he podido completarlo por varios errores de las sentencias sqlcmd, donde no se reconocen los comandos.

¿Será que no puedo colocar las sentencias sqlcmd directamente en el trabajo de SQL Server y es indispensable que lo coloque en un archivo externo?

Saludos cordiales,

JuanPLG,

Te explico un poco más para que me entiendas mejor,

Fíjate que estoy tratando de hacer en SOLO paso de Agente de SQL Server, y debe ser en un solo paso ya que allí debo mezclar tanto sentencias CmdExec y sentencias T-SQL.

Este paso va a estar creado bajo el tipo de sentencias del Sistema Operativo (CmdExec):

1).- Debo de declarar unas variables donde voy alojar las direcciones donde se encuentran archivos que voy a trasladar desde un Servidor B hacia mi servidor A (que es donde esta el SQL Server 2008).

DECLARE @nombre_servidor nvarchar (50),

2).- Luego debo de realizar varios select a una tabla donde estan configuradas dichas rutas y las voy a almacenar en las variables que definí anteriormente.

SELECT @nombre_servidor = nombre_servidor from dbo.config;

3).- luego voy a crear unos link con las variables anteriores para manipular el archivo que esta en el Servidor B, por ejemplo

rename \\@nombre_servidor\@ruta_directorios\Bam.dat NGN_0.dat

¿Es posible hacer esto en un solo paso que sea del tipo de sentencias del Sistema Operativo (CmdExec) del Agente de SQL Server 2008?

Muchas gracias,

Saludos,

Hola Ramorjo como estas !, bueno, se complica si no puedes generar un archivo del tipo cmd para manejar en un batch las sentencias tanto TSQL como del Sistema Operativo.
Igualmente desde mi punto de vista, tenes dos opciones:

Op - 1) Generar un Job del tipo TSQL y desde allí llamar al xp_cmdshell para poder interactuar con el sistema operativo, generando la sentencia a ejecutar por xp_cmdshell con variables, por ej:

DECLARE @nombre_servidor nvarchar (50)
DECLARE @stringexecute nvarchar (100)
SELECT @nombre_servidor = name from sys.servers
SET @stringexecute = 'dir ' + @nombre_servidor
PRINT @stringexecute
EXEC xp_cmdshell @stringexecute

Op - 2) Generar un paquete de SSIS.

Igualmente con el ejemplo de la opción 1), deberías poder realizar lo que quieras, siempre y cuando tengas el entorno de seguridad necesario para realizar las tareas correspondientes.

Saludos,

JuanPLG


Hola JuanPLG,

Sabes que he estado intentando esto para resolver mi problema, es mediante las sentancias SQLCMD.

Estoy tratrando de mover un archivo de un directorio a otro, las sentencias las ejecuto desde la máquina A donde esta el Servidor SQL Server 2008 y el directorio esta en la máquina B, estas son las sentencias.

DECLARE @nombre_servidor varchar(200);
DECLARE @ruta_directorios varchar(200);
SELECT @nombre_servidor = nombre_servidor FROM SAICS_NGN.dbo.config;
SELECT @ruta_directorios = ruta_directorios FROM SAICS_NGN.dbo.config;
:setvar nombre_servidor @nombre_servidor
:setvar ruta_directorios @ruta_directorios
:setvar MoveCommand "MOVE $nombre_servidor $ruta_directorios"
:!! $(MoveCommand)

Como no puedo tener archivos de configuración en la máquina A, entonces cree una tabla llamada config que tiene almacenadas las rutas donde debo buscar los archivos de interes, la columna de esta tabla llamada nombre_servidor tiene el siguiente string \\globalfiresamba\omar\prueba_SQLServer_NGN\Bam.dat, esta es la ruta completa del servidor B donde se encuentra mi archico .dat y el campo ruta_directorios de la tabla tiene alojado el string \\globalfiresamba\omar\prueba_SQLServer_NGN\data que es otra carpeta a donde quiero mover el archivo .dat.

Cuando ejecuto la sentencia :!! $(MoveCommand) me dice que el sistema no puede hayar el archivo especificado.

Cuando hago la siguiente prueba:

:setvar MoveCommand "MOVE \\globalfiresamba\omar\prueba_SQLServer_NGN\Bam.dat \\globalfiresamba\omar\prueba_SQLServer_NGN\data"
:!! $(MoveCommand)

Me lo ejecuata perfectamente. Al parecer estoy definiendo mal las variables, o las sentencias SQLCMD no pueden ser traidas desde una tabla en SQLServer, realmente no se porque no me funciona.

Pensé que el string se estaba llenando de basura o algo parecido pero no es así.

Ambas pruebas las estoy ejecuetando desde el motor SQLCMD de Sql Server 2008.

¿Tendrás alguna idea de lo que pueda pasar?

Gracias de antemano,

Saludos,

Hola Ramorjo como estas !, te cuento, tips a tener en cuenta

1) El sqlcmd es para ejecutar desde un shell comandos SQL.
2) Para solucionar tu problema deberías guardar el resultado de las ejecuciones de los comandos
via sqlcmd en variables a traves de script vbs para llamarlo desde SO o ejecutarlo con el SQL Server
Agent. Pero esta opción no sería válida pues necesitas crear un archivo físico (archivo.vbs)
3) La opción por la cual te independiza de crear archivos y poder manejarte desde el entorno es la que te
detallare en parrafos de este foro, la cual es utilizar el xp_cmdshell.
En Sql Server 2008 debes primero
habilitar el xp_cmdshell por condiciones y políticas. Create primero una condicion y luego una política. Para realizarlo debes acceder por la siguiente rama en el management studio de SQL Server 2008:

Management--> Conditions
Management--> Policy Management

Una vez que la creas debes validarla y se aplica a los target server, en este caso a tu server 2008 local.

Luego agendas en el agente de Sql Server:

DECLARE @nombre_servidor nvarchar (50)
DECLARE @ruta_directorio nvarchar (50)
DECLARE @stringexecute nvarchar (100)
SELECT @ruta_servidor = nombre_servidor FROM SAICS_NGN.dbo.config
SELECT @ruta_directorio = ruta_directorios FROM SAICS_NGN.dbo.config

SET @stringexecute = 'MOVE ' + @nombre_servidor +' '+@ruta_directorio
PRINT @stringexecute
EXEC xp_cmdshell @stringexecute

Un abrazo virtual

JuanPLG





+1 Demo: Async load