2010-11-18 14 views
6

Ich führe eine SQL Server 2008 64-Bit-Developer Edition mit Service Pack 1 installiert. Ich habe einen SQL Server-Agent-Job. In diesem Job möchte ich die job_id meines eigenen Jobs bekommen.
Auf MSDN (http://msdn.microsoft.com/en-us/library/ms175575(v=SQL.100).aspx) finden Sie eine Beschreibung der Verwendung von Token in Job-Schritten. Wow, großartig, genau das suche ich !! Verwenden Sie einfach (JOBID).
Seit SQL Server 2005 SP1 müssen Sie Makro wie $ (ESCAPE_NONE (JOBID)) verwenden. Kein Problem.
Aber wenn Sie versuchen, das Beispiel:SQL Server-Agent - eigene Job-ID

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

Sie erhalten:
falsche nahe Syntax 'ESCAPE_SQUOTE'. (Microsoft SQL Server, Fehler: 102)
Ok, jetzt von Grund auf:

PRINT N'$(ESCAPE_SQUOTE(JOBID))' 

Ergebnisse in 0xE33FE637C10B3C49A6E958BB3EF06959 aber die job_id ist 37E63FE3-0BC1-493C-A6E9-58BB3EF06959
Die "N '" I Think macht eine implizite Konvertierung in NVARCHAR der (JOBID) ...
Ok, ich denke ich muss mich um den Datentyp von (JOBID) kümmern. In dem Buch "SQL Server 2008 Administration" auf Seite 168/169 gibt es auch ein Beispiel für die Verwendung (JOBID):

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

Ergebnisse in:.
falsche Syntax nahe '(' (Microsoft SQL Server, Fehler :.. 102)
ich jetzt total verwirrt bin Könnte mit einem guten Rat oder Lösung Jede Art von Hilfe ist willkommen mir jemand helfen, bitte

mit freundlichen Grüßen Helmut

Antwort

3

Vergessen Sie einfach, was Parser sagt - Variable Auflösung wird zur Laufzeit durchgeführt. Parser weiß davon nichts.

3

Wir hatten Mühe w. Ich habe dies kürzlich getan und nicht die Route, die Sie in MSDN gefunden haben. Stattdessen haben wir die Jobid von dbo.sysjobs direkt nach Namen wiederhergestellt (das Gegenteil von Ihrem Beispiel) und dann innerhalb des Jobs verwendet, um den Ausführungsstatus zu überprüfen (Beenden der lang andauernden while-Schleife, wenn sich der Jobstatus geändert hat).

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

Das mag selbstverständlich klingen, aber ich habe den Fehler, den Sie von Ihrer ersten Probe zitiert, , wenn ich es in einem Abfragefenster laufen, aber es läuft ganz gut, wenn ich das Skript in einen Jobschritt einfügen.

Sie können diese Tokens nur innerhalb von Arbeitsschritten verwenden. Und da wir keine Anführungszeichen im Jobid-Token erwarten, würde ich ESCAPE_NONE verwenden, wenn Sie darauf verweisen.

4

danke für Ihre Antworten. Das Problem ist, dass ich versuchte, die Anweisung in Jobschritt zu analysieren. Dann habe ich diesen Fehler bekommen. Während des Jobs gibt es kein Problem. Meine beste Lösung ist jetzt:

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

Jetzt können Sie mit @JobID handhaben, aber soweit ich weiß bis jetzt haben Sie immer char konvertieren (255). Dank Benutzer state_dba auf MSDN.