MS SQL Server 2012;我有以下语法错误:“关键字“BEGIN”附近的语法不正确。”

MS SQL Server 2012;我有以下语法错误:“关键字“BEGIN”附近的语法不正确。”,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我的SQL Server 2012存储过程出现语法错误: CREATE PROCEDURE dbo.sp_UpdateOnHandQtyByMrchRcvd (@pn_location_id SMALLINT, @pn_item_id NUMERIC) BEGIN TRAN compute_inv_loc_bal; --Syntax Error near the KEYWORD 'BEGIN' BEGIN DECLARE @p_location_i

我的SQL Server 2012存储过程出现语法错误:

CREATE PROCEDURE dbo.sp_UpdateOnHandQtyByMrchRcvd 
     (@pn_location_id SMALLINT, 
      @pn_item_id NUMERIC)  
    BEGIN TRAN compute_inv_loc_bal; --Syntax Error near the KEYWORD 'BEGIN'
BEGIN 
    DECLARE @p_location_id  NUMERIC,
            @p_item_id NUMERIC,
            @p_qty NUMERIC,
            @p_on_hand_qty NUMERIC,
            @count INT,
            @p_trans_id NUMERIC,
            @p_trans_type_id INT,
            @p_trans_category_id INT,
            @p_trans_ref_id NUMERIC,
            @p_trans_type_code VARCHAR(35)

    -- reset item location qty
    UPDATE posit_db.dbo.item_location
    SET qty_on_hand = 0,
        updated_by = user_name(), 
        updated_date = getdate()
    WHERE location_id = @pn_location_id;

    -- Merchandise Received
    -- trans_type = MerRcvd, 10, trans_category = Purchase, 3
    DECLARE get_trans_data CURSOR FOR
        SELECT 
            it.location_id, it.trans_id, it.item_id, it.trans_type_id, 
            it.trans_category_id, it.trans_ref_id, it.qty,
            itt.trans_type_code
        FROM    
            posit_db..inventory_trans it, posit_db..inventory_trans_type itt
        WHERE 
            it.trans_type_id = itt.trans_type_id AND
            it.trans_category_id = itt.trans_category_id AND
            it.location_id = @pn_location_id AND
            it.trans_ref_id in (SELECT trans_id FROM posit_db..mrch_dist) AND
            it.item_id in (SELECT item_id FROM posit_db..mrch_dist) ;

    OPEN get_trans_data

    FETCH get_trans_data INTO @p_location_id, @p_trans_id, @p_item_id, @p_trans_type_id,
                              @p_trans_category_id, @p_trans_ref_id, @p_qty, @p_trans_type_code

    WHILE (@@fetch_status <> -1)    
关键字“BEGIN”附近的语法不正确

以下是我的存储过程的代码:

CREATE PROCEDURE dbo.sp_UpdateOnHandQtyByMrchRcvd 
     (@pn_location_id SMALLINT, 
      @pn_item_id NUMERIC)  
    BEGIN TRAN compute_inv_loc_bal; --Syntax Error near the KEYWORD 'BEGIN'
BEGIN 
    DECLARE @p_location_id  NUMERIC,
            @p_item_id NUMERIC,
            @p_qty NUMERIC,
            @p_on_hand_qty NUMERIC,
            @count INT,
            @p_trans_id NUMERIC,
            @p_trans_type_id INT,
            @p_trans_category_id INT,
            @p_trans_ref_id NUMERIC,
            @p_trans_type_code VARCHAR(35)

    -- reset item location qty
    UPDATE posit_db.dbo.item_location
    SET qty_on_hand = 0,
        updated_by = user_name(), 
        updated_date = getdate()
    WHERE location_id = @pn_location_id;

    -- Merchandise Received
    -- trans_type = MerRcvd, 10, trans_category = Purchase, 3
    DECLARE get_trans_data CURSOR FOR
        SELECT 
            it.location_id, it.trans_id, it.item_id, it.trans_type_id, 
            it.trans_category_id, it.trans_ref_id, it.qty,
            itt.trans_type_code
        FROM    
            posit_db..inventory_trans it, posit_db..inventory_trans_type itt
        WHERE 
            it.trans_type_id = itt.trans_type_id AND
            it.trans_category_id = itt.trans_category_id AND
            it.location_id = @pn_location_id AND
            it.trans_ref_id in (SELECT trans_id FROM posit_db..mrch_dist) AND
            it.item_id in (SELECT item_id FROM posit_db..mrch_dist) ;

    OPEN get_trans_data

    FETCH get_trans_data INTO @p_location_id, @p_trans_id, @p_item_id, @p_trans_type_id,
                              @p_trans_category_id, @p_trans_ref_id, @p_qty, @p_trans_type_code

    WHILE (@@fetch_status <> -1)    

应该是相反的。首先开始过程块,然后开始其中的事务块,反之亦然

create procedure dbo.sp_UpdateOnHandQtyByMrchRcvd (
BEGIN
BEGIN TRAN compute_inv_loc_bal;
编辑

我已经修改了我原来的答案

尝试构建存储过程时出现的错误是由于参数声明造成的。它们周围不应有开/闭括号。虽然不是必需的,但是您可能想考虑将存储过程的代码封装在开始/结束块中,尽管Dan Guzman用他的评论指出,它在语法上是可选的。此外,我会将BEGIN TRAN语句移动到变量声明之后,尽管这不是必需的

CREATE PROCEDURE dbo.sp_UpdateOnHandQtyByMrchRcvd
    @pn_location_id  smallint, 
    @pn_item_id      numeric
AS
BEGIN
    DECLARE @p_location_id        numeric,
            @p_item_id            numeric,
            @p_qty                numeric, 
            @p_on_hand_qty        numeric,
            @count                int,
            @p_trans_id           numeric,
            @p_trans_type_id      int,
            @p_trans_category_id  int,
            @p_trans_ref_id       numeric,
            @p_trans_type_code    varchar(35)

    BEGIN TRAN compute_inv_loc_bal;

    /* REMAINDER OF YOUR STORED PROCEDURE GOES HERE... */

END

开始/结束块不是必需的。中的方括号表示它们是可选的。虽然BEGIN/END是可选的,但根据我自己的经验,我强烈建议使用BEGIN/END以获得清晰性和更好的格式。旁注:您不应该在存储过程中使用sp_uu前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用sp_uu,并使用其他东西作为前缀-或者根本不使用前缀早在25年前,在ANSI-92 SQL标准中,老式的逗号分隔表列表样式就被正确的ANSI连接语法所取代,不鼓励使用它。难道BEGIN TRAN不应该在BEGIN中吗???