2010-07-21 126 views
1

請幫我這個:一個現有的連接被強行關閉遠程主機

此代碼的工作,除了在其控制進行「NOT EXSISTS」,那麼之後的任何查詢運行的IF塊內的情況下罰款這個塊的執行會導致sql連接被強制關閉,儘管運行這個代碼塊的結果是正確的。運行後我無法運行其他查詢。

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

你真的有2個獨立的列,一個叫UserUsername,另一個叫用戶名嗎?什麼'fnGetManagerId'看起來像? – 2010-07-21 13:09:09

+0

如果在查詢分析器中運行相同的查詢,會發生什麼情況? – 2010-07-21 13:35:56

回答

2

我似乎記得看到有關使用SQL2000標量UDF,可能會導致訪問衝突也許你已經打了其中的一個漏洞知識庫文章?我第一次獨立於UDF參數列表中的演員和做其它列

更換

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

隨着

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

那麼,如果問題仍然存在,同時註釋掉線直到找到罪魁禍首。

我會看看SQL Server錯誤日誌。您也可以使用SQL Profiler來跟蹤用戶錯誤消息。嚴重程度足夠高的錯誤會自動關閉連接。

+0

謝謝,我認爲這隻會發生在Sql 2000中,在參數列表中使用cast inline傳遞參數會使服務器崩潰。在單獨的一行中執行它可以正常工作。 – teenup 2010-07-22 08:22:49

1

我相信你的IF語句是不正確的。嘗試:

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

它爲什麼會導致連接崩潰? – 2010-07-21 13:13:45

+1

@Martin:我不確定。 @Puneet:你可以粘貼你正在使用的SQL實例的ERRORLOG嗎? – sbenderli 2010-07-21 13:17:14

相關問題