Sql server SQL Server将创建/更改和执行结合起来

Sql server SQL Server将创建/更改和执行结合起来,sql-server,stored-procedures,sql-server-2016,Sql Server,Stored Procedures,Sql Server 2016,当您收到一个错误,并且在SSMS中收到一条消息,其中包含发生错误的代码行时,您需要查找该行的内容 但是我遇到了一只虫子。 如果在SQL Server上运行以下代码,将得到一个递归函数调用。看起来ALTER接受EXEC作为存储过程的一部分,即使它位于as BEGIN…END行之后 ALTER PROCEDURE SP_GetErrorLine( @lineNum INT, @spName NVARCHAR(250) ) AS BEGIN SET NOCOUNT ON

当您收到一个错误,并且在SSMS中收到一条消息,其中包含发生错误的代码行时,您需要查找该行的内容

但是我遇到了一只虫子。 如果在SQL Server上运行以下代码,将得到一个递归函数调用。看起来ALTER接受EXEC作为存储过程的一部分,即使它位于as BEGIN…END行之后

ALTER PROCEDURE SP_GetErrorLine(
    @lineNum INT, 
    @spName NVARCHAR(250)
) AS BEGIN
    SET NOCOUNT ON
    CREATE TABLE #spLine (
        line INT NOT NULL IDENTITY(1,1),
        Bob NVARCHAR(2048) NOT NULL
    )

    INSERT INTO #spLine (Bob)
        EXEC sp_helptext @spName

    DECLARE @line NVARCHAR(2048)

    SELECT @line=Bob FROM #spLine
        WHERE line=@lineNum

    DROP TABLE #spLine;

    SELECT @lineNum AS [Line No.], LTRIM(RTRIM(@line)) AS [SP Line]
END

EXEC SP_GetErrorLine 67, 'SP_AnotherProcedure'
(您需要在运行它时,将SP_另一个过程替换为同一数据库中的任何其他存储过程。)

这是预期的行为,还是错误地解析代码


干杯

开始/结束不是批处理终止符。你所经历的正是它应该如何表现。如果希望有多个脚本,则需要在批之间放置批分隔符。默认的批处理分隔符是GO


也就是说,您可以在单个批次中拥有任意数量的开始/结束块。真正的诀窍不是将批与块混淆。

BEGIN/END不是批终止符。你所经历的正是它应该如何表现。如果希望有多个脚本,则需要在批之间放置批分隔符。默认的批处理分隔符是GO。这不是你问题的答案,但你可以看看这篇文章。为了进一步说明肖恩的观点,请取出
开始
/
结束
(它们不是必需的)。存储过程仍然会被创建。SQL Server将
END
视为块的结尾,而不是过程的结尾,因此它后面的任何内容都将是过程的一部分。啊,谢谢@SeanLange,我不知道性能的花絮。是时候重新命名了。让我困惑的是它被接受为BEGIN。。。END没有投诉,如果函数是多行函数,则需要使用
BEGIN…END
,因此我假设这里就是这种情况。您是否可以使用BEGIN/END而不使用
IF(X)
AS
作为作用域或其他什么?(我来自C++,你可以使用代码> {}} /Case> s)是的,你也可以使用任何数量的代码。它只划分与批处理不同的代码块。还值得注意的是,您不能在中间没有语句的情况下执行
BEGIN-END
——这被视为接近尾端的不正确语法,这可能解释了为什么我没有意识到
BEGIN/END
可以在没有条件的情况下使用。