在 SQL 服务器中结束过程创建的语法

Syntax for ending Procedure creation in SQL server

我想在 Begin-End-Block 中创建一个临时过程,然后 运行 使用不同参数的过程。我必须这样做,因为我不想在服务器上创建持久的过程,但我在获得正确的语法方面遇到了一些问题。 我想要的是这样的:

begin

    create temp proc
    declare some variables
    call proc multiple times
end;

目前看起来像这样,但我遇到语法错误:

use mycontext
begin
    CREATE PROC #my_procedure @period_name varchar(10), @from date, @to date
    AS
    begin
        VeryLongMergeStatement;
    end;
    GO

    declare @today date= GETDATE();
    declare @other_date date = EOMONTH(GETDATE(), (-1 - 3));
    declare more dates

    #my_procedure 'period_title' @today @other_date
end;

我找到了 this 但它并没有真正帮助我。我尝试了很多不同的分号组合,m 有开始和结束,没有它,有 go 和没有它。它总是显示错误。 它可能只是一些小东西,但我找不到它。

您不能在编程块中创建临时存储过程。这是不允许的,所以这 returns 一个错误:

begin
    create procedure #abc as begin print 2; end;

    print 1;
end;

为什么? documentation 很清楚:

The CREATE PROCEDURE statement cannot be combined with other Transact-SQL statements in a single batch.

我应该补充一点,“批处理”不能中断 BEGIN/END 块。

因此,简单的解决方法是在块外部 创建存储过程,然后使用它:

create procedure #abc as begin print 2; end;

begin
    print 1;
    exec #abc;
end;

你有几个问题。首先,a CREATE/ALTER PROCEDURE 需要是批次中的东西;您之前有一个 USE 语句,因此它不是该批次中唯一的一个。你还有一个 BEGIN 在单独的批次中到 END,这将导致错误。

最后,EXEC 的语法错误,您需要用逗号分隔参数 (,)。这给你这样的东西(注释掉的部分使 SQL 有效):

USE sandbox;
GO
CREATE PROC #my_procedure @period_name varchar(10), @from date, @to date
AS
BEGIN
    --VeryLongMergeStatement;
    PRINT 1;
END;
GO

declare @today date= GETDATE();
declare @other_date date = EOMONTH(GETDATE(), (-1 - 3));
--declare more dates

EXEC #my_procedure 'period_title', @today, @other_date;
GO

DROP PROC #my_procedure;