Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 SSMS 2008 R2在错误位置绘制大纲_Sql Server 2008_Code Folding_Outlining - Fatal编程技术网

Sql server 2008 SSMS 2008 R2在错误位置绘制大纲

Sql server 2008 SSMS 2008 R2在错误位置绘制大纲,sql-server-2008,code-folding,outlining,Sql Server 2008,Code Folding,Outlining,我正在使用SSMS 2008R2连接到SQL 2012企业数据库(如果需要的话)。根据下面的屏幕截图,您可以看到SSMS正在添加的大纲位于错误的位置。有没有关于如何确保大纲正确工作的想法?此外,当查询中发生错误时,错误中的行号与查询/文件中的行号不对齐(以数百为单位) 我已经涂黑了一些字段,但我向您保证查询运行良好,因此select语句的语法不是问题。一个快速的答案是,您可以双击SSMS中的错误消息,它将带您进入实际错误,而不管行#它声明的错误是否与您在SSMS中看到的一致。。。通常 话虽如此

我正在使用SSMS 2008R2连接到SQL 2012企业数据库(如果需要的话)。根据下面的屏幕截图,您可以看到SSMS正在添加的大纲位于错误的位置。有没有关于如何确保大纲正确工作的想法?此外,当查询中发生错误时,错误中的行号与查询/文件中的行号不对齐(以数百为单位)

我已经涂黑了一些字段,但我向您保证查询运行良好,因此select语句的语法不是问题。

一个快速的答案是,您可以双击SSMS中的错误消息,它将带您进入实际错误,而不管行#它声明的错误是否与您在SSMS中看到的一致。。。通常

话虽如此,这里有一些事情要记住

批量

首先,每批都将根据您的行号计算。运行下面的代码。它将在第34行出错,尽管错误在第39行。原因是前两批
QUOTED\u IDENTIFIER
ANSI\u NULLS
占用了5行。如果将这些注释掉,将返回正确的行号

使用WHERE/join选择

如果您的错误在
WHERE
中的某个地方,并且可能是
连接
,则将返回语句开头的行号。注释掉前两个批次,取消注释底部我们除以0的
SELECT
,注释掉底部的
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
错误\u行()

您可以使用
ERROR\u LINE()
返回错误行,但这将模拟您在SSMS中看到的错误。因此,如果您有多个批次,它将是“不正确的”

解决方案?

也许数学。。。根据错误的不同,您建议的每个选择都可以计为一行。因此,在代码中设置一个行计数器(每选择一行,批处理+1)可以帮助您缩小潜在的错误范围。或者,如果这是一个过程,请查看
sp\u 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
一个快速的答案是,您可以双击SSMS中的错误消息,它将引导您找到实际错误,无论这行内容是否与您在SSMS中看到的内容相匹配。。。通常

话虽如此,这里有一些事情要记住

批量

首先,每批都将根据您的行号计算。运行下面的代码。它将在第34行出错,尽管错误在第39行。原因是前两批
QUOTED\u IDENTIFIER
ANSI\u NULLS
占用了5行。如果将这些注释掉,将返回正确的行号

使用WHERE/join选择

如果您的错误在
WHERE
中的某个地方,并且可能是
连接
,则将返回语句开头的行号。注释掉前两个批次,取消注释底部我们除以0的
SELECT
,注释掉底部的
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
错误\u行()

您可以使用
ERROR\u LINE()
返回错误行,但这将模拟您在SSMS中看到的错误。因此,如果您有多个批次,它将是“不正确的”

解决方案?

也许数学。。。根据错误的不同,您建议的每个选择都可以计为一行。因此,在代码中设置一个行计数器(每选择一行,批处理+1)可以帮助您缩小潜在的错误范围。或者,如果这是一个过程,请查看
sp\u 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

你看到这个了吗?我见过类似的事情。我们说的不是一两行,而是数百行,在CREATE/ALTER语句上面没有太多额外的内容。我相信这与系统将一条select语句作为一行进行评估有关,即使为了可读性(每个字段一行),该语句分布在100行上。我认为大纲功能不应该关心这个问题。你有很多if-else-begin语句吗?我注意到SSM按照您的建议对其进行了评估。我确实有很多,是的。大纲对我来说更重要,因为程序中的代码越来越长。然而,随着代码的增长,大纲绘制开始失败。哦,好吧,我将把它记为SSMS错误。谢谢你确认你看到了同样的东西。我的意思是没有@thomas Sorry自动更正我的手机。过几天我会做些测试你看到这个了吗?我见过类似的事情。我们不是在说1或2林