2010-07-21 5 views
1

à distance S'il vous plaît me aider:Une connexion existante a été fermée de force par l'hôte

Ce code fonctionne bien, sauf dans les cas où le contrôle va à l'intérieur du bloc IF « NOT exsists », toute requête exécutée après l'exécution de ce bloc provoque la fermeture forcée de la connexion sql, bien que les résultats de l'exécution de ce bloc de code soient corrects. Je ne peux pas exécuter d'autres requêtes après l'avoir exécuté.

IF(@Mode='Get') 
BEGIN 
    IF(@Field='manager') 
    BEGIN 
     DECLARE @UserUserName NVARCHAR(250) 
     DECLARE @UserID AS VARCHAR(50) 
     SELECT @UserUserName=CAST(Value AS NVARCHAR(250)) FROM dbo.UserProperties WHERE [Key][email protected] AND Field='manager' 
     IF(NOT EXISTS(SELECT * FROM dbo.Users WHERE [email protected]) OR @UserUserName IS NULL) 
     BEGIN 
      SELECT @UserID = dbo.fnGetManagerId(CAST(@Key AS INT)) -- numeric 
      SELECT @UserUserName=UserUsername FROM dbo.Users WHERE [email protected] 
     END 
     SELECT UserName AS Value FROM users WHERE [email protected] 
    END 
    ELSE 
    BEGIN 
     SELECT Value FROM dbo.UserProperties WHERE [Key][email protected] AND [email protected] 
    END 
END 
+1

Avez-vous vraiment deux colonnes séparées appelées «UserUsername» et l'autre «Username»? À quoi ressemble 'fnGetManagerId'? –

+0

Également ce qui se passe si vous exécutez la même requête dans l'analyseur de requête? –

Répondre

2

Je me souviens avoir vu des articles kb au sujet de bugs avec UDFs scalaire dans SQL2000 qui pourraient causer des violations d'accès que vous avez peut-être frappé l'un de ces? Je voudrais tout d'abord séparer la distribution de la liste des paramètres UDF et de le faire dans une autre ligne

Remplacer

SELECT @UserID = dbo.fnGetManagerId(CAST(@Key AS INT)) -- numeric 

Avec

DECLARE @K int 
SET @K = CAST(@Key AS INT) 
SELECT @UserID = dbo.fnGetManagerId(@K) 

alors si le problème persiste commentez une ligne à la fois jusqu'à ce que vous trouviez le coupable.

Je regarder dans les journaux d'erreurs SQL Server. Vous pouvez également utiliser SQL Profiler pour suivre les messages d'erreur des utilisateurs. Une erreur de gravité suffisamment élevée fermerait automatiquement la connexion.

+0

Merci, je pense que cela se produira uniquement dans Sql 2000, en passant le paramètre en utilisant cast inline dans la liste des paramètres bloque le serveur. Le faire dans une ligne séparée fonctionne bien. – teenup

1

Je crois que votre instruction IF est incorrecte. Essayez:

IF NOT (EXISTS(SELECT * FROM dbo.Users WHERE [email protected]) OR @UserUserName IS NULL) 
+0

Pourquoi est-ce que cela provoquerait le crash de la connexion? –

+1

@ Martin: Je ne suis pas sûr. @Puneet: Pouvez-vous coller l'ERRORLOG de l'instance SQL sur laquelle vous travaillez? – sbenderli

Questions connexes