2010-07-13 5 views
0

J'utilise context_info pour simuler une variable globale, je l'utilise dans ce contexte.Pourquoi context_info peut échouer?

J'ai des scripts composés de plusieurs lots, je définis une variable globale au début (123 dans l'exemple) puis après tous les lots j'utilise ce nombre pour remplir une table de journal.

Maintenant que cela fonctionne, mais aujourd'hui il a échoué sur une machine, je ne peux pas comprendre pourquoi. Y a-t-il une raison pour que context_info ne fonctionne pas? J'ai essayé de remplacer manuellement context_info avec 123 et le script a été réussi. Le script a été exécuté à partir d'une application Delphi.

DECLARE @GlobalInteger binary(128) 
SET @GlobalInteger =cast(123 as binary(128)) 
SET CONTEXT_INFO @GlobalInteger 
GO 

BATCH 1 
GO 

... 

BATCH N 
GO 

INSERT INTO TABLE_LOG VALUES (cast(context_info() as INT) 

Répondre

2

Il y a quelques remarques dans la documentation CONTEXT_INFO:

ensembles de résultats multiples actifs (MARS) permet aux applications d'exécuter plusieurs lots, ou des demandes, en même temps sur la même connexion . Lorsque l'un des lots exécute une connexion MARS SET CONTEXT_INFO, la nouvelle valeur de contexte est renvoyée par la fonction CONTEXT_INFO lorsqu'elle est exécutée dans le même lot que l'instruction SET. La nouvelle valeur n'est pas retourné par la fonction run de CONTEXT_INFO dans un ou plusieurs des autres lots sur la connexion , à moins qu'ils ont commencé après le lot qui a couru l'instruction SET terminé

Il y a aussi quelques explications sur la façon dont la valeur se propage aux différentes vues qui l'exposent (sys.dm_exec_requests, sys.dm_exec_sessions et CONTEXT_INFO elle-même), voir Utilisation de Session Context Information. Dans certains endroits, l'information est visible immédiatement, dans d'autres endroits est visible seulement après que le lot est terminé.

Questions connexes