2016-07-20 33 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