MS SQL Server 2012;我有以下语法错误:“关键字“BEGIN”附近的语法不正确。”
我的SQL Server 2012存储过程出现语法错误: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
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中吗???