2010-11-18 22 views
6

Sono in esecuzione una Developer Edition a 64 bit di SQL Server 2008 con Service Pack 1 installato. Ho un processo SQL Server Agent. All'interno di questo lavoro voglio ottenere il job_id del mio lavoro.
Su MSDN (http://msdn.microsoft.com/en-us/library/ms175575(v=SQL.100).aspx) è possibile trovare una descrizione dell'utilizzo dei token nelle fasi del lavoro. Wow, fantastico, è quello che sto cercando !! Basta usare (JOBID).
Poiché SQL Server 2005 SP1 è necessario utilizzare macro come $ (ESCAPE_NONE (JOBID)). Nessun problema.
Ma se si tenta l'esempio:Agente SQL Server - ottenere il mio job_id

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

si ottiene:
la sintassi non corretta in prossimità 'ESCAPE_SQUOTE'. (Microsoft SQL Server, errore: 102)
Ok, ora da zero:

PRINT N'$(ESCAPE_SQUOTE(JOBID))' 

risultati in 0xE33FE637C10B3C49A6E958BB3EF06959 ma il job_id è 37E63FE3-0BC1-493C-A6E9-58BB3EF06959
La "N '" io pensa di effettuare una conversione implicita in NVARCHAR del (JOBID) ...
Ok, penso che mi debba interessare il tipo di dati di (JOBID). Nel libro "SQL Server 2008 Administration" a pagina 168/169 c'è anche un esempio di utilizzo (JOBID):

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

risultati in:.
la sintassi non corretta in prossimità '(' (Microsoft SQL Server, Error :.. 102)
sono totalmente confuso ora Potrebbe per favore qualcuno mi aiuti con un buon consiglio o una soluzione Ogni tipo di aiuto è apprezzato

migliori saluti Helmut

risposta

3

Basta dimenticare cosa dice il parser - la risoluzione variabile viene eseguita in fase di esecuzione. Parser non lo sa.

3

Abbiamo avuto problemi w. con questo recentemente e non ha seguito il percorso che hai trovato in MSDN. Invece, abbiamo recuperato il jobid da dbo.sysjobs per nome direttamente (l'opposto del tuo esempio) e poi usato quello all'interno del lavoro per controllare lo stato di esecuzione (uscendo dalla lunga esecuzione mentre il ciclo se lo stato del lavoro era cambiato).

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

Questo può sembrare ovvio, ma ottengo l'errore che hai citato dal primo campione, se l'eseguo in una finestra di query, ma funziona perfettamente quando ho incolla che lo script in un passaggio di processo.

È possibile utilizzare questi token solo nei passaggi del processo. E, dato che non ci aspettiamo citazioni nel token jobid, userei ESCAPE_NONE ogni volta che fai riferimento ad esso.

4

grazie per le vostre risposte. Il problema è che ho provato ad analizzare la dichiarazione nella fase di lavoro. Quindi ho ricevuto questo errore. Durante l'esecuzione del lavoro non ci sono problemi. La mia soluzione molto migliore ora è:

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

Ora è maneggiare con @JobID, ma per quanto ne so fino ad ora si deve convertire sempre a char (255). Grazie all'utente stato_dba su MSDN.

Problemi correlati