2010-11-18 29 views
6

Estoy ejecutando un SQL Server 2008 Edición de desarrollador de 64 bits con el Service Pack 1 instalado. Tengo un trabajo del Agente SQL Server. Dentro de este trabajo quiero obtener el job_id de mi propio trabajo.
En MSDN (http://msdn.microsoft.com/en-us/library/ms175575(v=SQL.100).aspx) puede encontrar una descripción del uso de tokens en los pasos del trabajo. Wow, genial, ¡eso es lo que estoy buscando! Solo usa (JOBID).
Desde SQL Server 2005 SP1, debe usar macro como $ (ESCAPE_NONE (JOBID)). No hay problema.
Pero si se intenta el ejemplo:Agente SQL Server - obtener mi propio job_id

DECLARE @name NVARCHAR(128) 
select @name = name from msdb.dbo.sysjobs where job_id = $(ESCAPE_SQUOTE(JOBID)) 
PRINT @name 

que se obtiene:
sintaxis incorrecta cerca de 'ESCAPE_SQUOTE'. (Microsoft SQL Server, Error: 102)
Ok, ahora desde el cero:

PRINT N'$(ESCAPE_SQUOTE(JOBID))' 

resultados en 0xE33FE637C10B3C49A6E958BB3EF06959 pero el job_id es 37E63FE3-0BC1-493C-A6E9-58BB3EF06959
La "N '" I Creo que hace una conversión implícita a NVARCHAR del (JOBID) ...
Ok, creo que me tiene que importar el tipo de datos de (JOBID). En el libro "SQL Server 2008 Administración" en la página 168/169 también hay un ejemplo del uso (JOBID):

declare @jobid binary(16) 
SELECT @jobid =Convert(Uniqueidentifier,$(ESCAPE_NONE(JOBID))) 

resultados en:.
sintaxis incorrecta cerca '(' (Microsoft SQL Server, error :.. 102)
estoy totalmente confundido ahora pudiera por favor alguien que me ayude con un buen consejo o una solución de cada tipo de ayuda se agradece

saludos Helmut

Respuesta

3

Simplemente olvida lo que dice el analizador: la resolución variable se realiza en el tiempo de ejecución. Parser no sabe sobre eso.

3

tuvimos problemas w. con esto recientemente y no fue la ruta que encontró en MSDN. En su lugar, recuperamos el jobid de dbo.sysjobs por nombre directamente (lo contrario de su ejemplo) y luego lo usamos dentro del trabajo para verificar el estado de ejecución (salir de la ejecución larga mientras que el ciclo si el estado del trabajo había cambiado).

declare @jobid uniqueidentifier 
SELECT @jobid = job_id from msdb.dbo.sysjobs where name = '[blah]' 
2

Esto puede sonar obvio, pero me sale el error que usted ha citado desde su primera muestra, si lo ejecuto en una ventana de consulta, pero funciona perfectamente bien cuando me pega esa secuencia de comandos en un paso de trabajo.

Solo puede usar estos tokens dentro de los pasos del trabajo. Y, dado que no esperamos cotizaciones en el token de jobid, usaría ESCAPE_NONE siempre que lo referencia.

4

gracias por sus respuestas. El problema es que traté de analizar la declaración en el paso de trabajo. Entonces obtuve este error. Mientras se ejecuta el trabajo no hay problema. Mi mejor solución ahora es:

declare @JobID uniqueidentifier 
SELECT @JobID = $(ESCAPE_NONE(JOBID)); 
PRINT 'My JobID is ' + Convert(char(255), @JobID) 

Ahora se manejan con @JobID, pero por lo que sé hasta ahora se tiene que convertir siempre a char (255). Gracias al usuario state_dba en MSDN.

Cuestiones relacionadas