2016-07-20 38 views
1

我正在使用SSMS 2008R2連接到SQL 2012企業數據庫(如果有的話)。根據下面的屏幕截圖,您可以看到SSMS正在添加的大綱位於不正確的位置。有關如何確保大綱正常工作的任何想法?另外,當查詢中發生錯誤時,錯誤中的行號絕不會與查詢/文件中的行號對齊(關閉數百)。SSMS 2008 R2概述錯誤位置

enter image description here

我已經昏了一些字段,但我向你保證查詢運行良好,因此選擇語句的語法不是問題。

+0

你見過嗎? http://stackoverflow.com/questions/4565614/how-can-i-get-the-actual-stored-procedure-line-number-from-an-error-message – scsimon

+0

我見過類似的事情。我們不是在說1或2行 - 我們正在談論數百行,而CREATE/ALTER語句之上沒有那麼多額外的東西。我相信這與系統評估1條select語句爲1行有關,即使爲了可讀性(每場一行)而將語句分散到100行中。我認爲雖然概述功能不應該關心這一點。 – thomas

+0

你有很多if else begin語句嗎?我注意到SSMS正如你所建議的那樣評估它。 – scsimon

回答

0

一個簡單的答案是你可以DOUBLE CLICK在SSMS中的錯誤消息,它會帶你到實際的錯誤,無論是#是它說明錯誤是在匹配你看到SSMS內...通常。

有了這樣說,這裏有一些事情要牢記......

首先,每個批次將計入您的行號。運行下面的代碼。它將在34行錯誤了,雖然錯誤是在39原因是我們採取了5行與前兩批QUOTED_IDENTIFIERANSI_NULLS。如果您將這些註釋掉,則會返回正確的行號。

選擇具有WHERE/JOINS

如果你的錯誤是在某處你WHERE和潛在的一個JOIN,將返回的語句開頭的行號。將前兩批註釋掉,取消註釋底部的SELECT,然後用0除以底部註釋SET @testing = 'one'。你會發現34號線是什麼將錯誤,這是語句的開始返回,但實際的錯誤是在線路37

的錯誤選擇

顯然,錯誤的類型,我沒有縮小 - 但不是水平和國家 - 影響行號。我不能告訴你爲什麼,但要記住這一點。在除以0的錯誤,如果你雙擊錯誤消息它會帶你到SELECT語句與錯誤的實際行號。這是我在帖子頂部提到的「通常」條款。 這是一段代碼片段。

SELECT 
    1/1, 
    1/2, 
    --a.b --Errors at the actual line 
    1/0 --Errors at the SELECT line number 
WHERE 
    1=1 

ERROR_LINE()

您可以使用ERROR_LINE()返回錯誤行,但是這是要模仿你在SSMS的錯誤看到。所以如果你有多個批次,它將是「不正確的」。

周圍工作?

也許數學......每個SELECT按照你的建議,根據錯誤,可以計爲1行。因此,在代碼中有一個計數器(每個選擇的BATCH + 1)可以幫助您縮小潛在的錯誤。或者,如果它是一個過程,看看sp_helptext


代碼以進行測試

SET QUOTED_IDENTIFIER OFF 
GO 

SET ANSI_NULLS ON 
GO 

SET NOCOUNT ON 

SELECT 
    CASE 
     WHEN 1=1 THEN 1 
     ELSE 2 
END 



DECLARE @Testing int 

SET @Testing = 1 

IF @Testing = 1 

    BEGIN 
     SELECT 
      'Testing is set to 1' 
    END 
ELSE 
    BEGIN 
     SELECT 
      'Testing is not set to 1' 
    END 


--SELECT 
    --1 
-- WHERE 
    --1 = @Testing/0 

SET @Testing = 'one' 

GO