2010-12-07 46 views
1

J'écris un proc stocké dans SQL Server 2008. Le code suivant:déclaration de verrouillage ne sera pas compilé avec INNER JOIN présente

SELECT  @LastAccessed = cs.LastAccessed 
FROM  [int].ClientSessions AS cs INNER JOIN 
      dbo.Profiles AS p ON cs.ProfileID = p.ProfileID 
WITH  (XLOCK, ROWLOCK) 
WHERE  (p.ClientID = @ClientID) 

... ne compilera pas, indiquant une erreur de syntaxe à XLOCK .

Si je supprime l'instruction INNER JOIN (ce qui est impossible parce que j'ai besoin de la jointure), alors ça va avec le XLOCK. Je ne vois pas quel est le problème.

Remarque: Je veux uniquement verrouiller la table [int] .ClientSessions, donc je me rends compte que ce n'est peut-être pas la meilleure approche.

Répondre

2

Vous devez mettre le WITH (XLOCK, ROWLOCK) après l'instruction as cs/as p.

Quelque chose comme

SELECT  @LastAccessed = cs.LastAccessed 
FROM  [int].ClientSessions AS cs WITH (XLOCK, ROWLOCK) INNER JOIN 
      dbo.Profiles AS p ON cs.ProfileID = p.ProfileID 
WHERE  (p.ClientID = @ClientID) 

Jetez un oeil à Table Hints (Transact-SQL)

+0

Wow, ce n'était pas dans ma liste de deviner. Merci. – IamIC

+0

Je suppose que le 2e AVEC est une faute de frappe. Je suis arrivé à compiler ce qui suit: SELECT \t \t @LastAccessed = cs.LastAccessed \t DE \t \t [int] .ClientSessions AS cs INNER JOIN \t \t \t \t dbo.Profiles AS p \t AVEC \t \t (XLOCK, ROWLOCK) \t \t \t \t SUR cs.ProfileID = p.ProfileID \t OÙ \t \t (p.ClientID = @ClientID) – IamIC

+0

@IanC, désolé, oui, il était X-) Votre –