【问题标题】:Stored procedure expects parameter 'Incorrect syntax near ':'.'存储过程需要参数“':' 附近的语法不正确。”
【发布时间】:2021-10-25 23:26:54
【问题描述】:

我在 SQL Server 中有以下存储过程:

CREATE PROCEDURE [PROC_SET_BRN_RPT_STSTC]  
    @I_RPT_I varchar(max),
    @I_MSTR_TBL varchar(max)
AS 
BEGIN
    DECLARE
        @VD_PSTG_D datetime2(0),
        @V_SQL varchar(4000),
        @BMG_RPT_I varchar(5) = ISNULL(@I_RPT_I, '') + 'M',
        @MAM_RPT_I varchar(5) = ISNULL(@I_RPT_I, '') + 'P';

    /*vd_pstg_d   :=  GET_DATE ('TDTD');*/
    SELECT @VD_PSTG_D = max(TIME_DIMN.DATE_D)
    FROM TIME_DIMN
    WHERE TIME_DIMN.TME_DIMN_I IN ( 'TDTD', 'TDSH' );

    DECLARE @SQLString NVARCHAR(500); 
    SET @SQLString = 'Delete From RPT_STSTC Where TXN_PSTG_D = :1 and Rpt_i = :2';
    Execute sp_executesql @SQLString, @vd_pstg_d, @I_Rpt_I;

    IF @@TRANCOUNT > 0
        COMMIT TRANSACTION;

当我尝试执行存储过程时,出现以下错误:

':' 附近的语法不正确。

你知道会是什么问题吗?

【问题讨论】:

  • SQL Server 使用命名参数,所以需要Where TXN_PSTG_D = @vd_pstg_d and Rpt_i = @I_Rpt_I。不清楚为什么需要动态 SQL,这可以作为普通的DELETE
  • 仅供参考的程序不需要包含在 BEGIN..END 中

标签: sql sql-server tsql sql-server-2008 stored-procedures


【解决方案1】:

正如对您问题的评论中所指出的,此存储过程中不需要动态 SQL。你可以重写它:

CREATE PROCEDURE [PROC_SET_BRN_RPT_STSTC]  
    @I_RPT_I varchar(max),
    @I_MSTR_TBL varchar(max)
AS 
BEGIN
    DECLARE
        @VD_PSTG_D datetime2(0),
        @V_SQL varchar(4000),
        @BMG_RPT_I varchar(5) = ISNULL(@I_RPT_I, '') + 'M',
        @MAM_RPT_I varchar(5) = ISNULL(@I_RPT_I, '') + 'P';

    /*vd_pstg_d   :=  GET_DATE ('TDTD');*/
    SELECT @VD_PSTG_D = max(TIME_DIMN.DATE_D)
    FROM TIME_DIMN
    WHERE TIME_DIMN.TME_DIMN_I IN ( 'TDTD', 'TDSH' );

    DELETE FROM RPT_STSTC 
    WHERE TXN_PSTG_D = @vd_pstg_d AND Rpt_i = @I_Rpt_I;

    IF @@TRANCOUNT > 0
        COMMIT TRANSACTION;

只有在绝对需要时才使用sp_executesql - 在这里你不需要它。

只是为了回答您的问题,您可以这样做(但在这种简单的情况下不建议这样做):

CREATE PROCEDURE [PROC_SET_BRN_RPT_STSTC]  
    @I_RPT_I varchar(max),
    @I_MSTR_TBL varchar(max)
AS 
BEGIN
    DECLARE
        @VD_PSTG_D datetime2(0),
        @V_SQL varchar(4000),
        @BMG_RPT_I varchar(5) = ISNULL(@I_RPT_I, '') + 'M',
        @MAM_RPT_I varchar(5) = ISNULL(@I_RPT_I, '') + 'P';

    /*vd_pstg_d   :=  GET_DATE ('TDTD');*/
    SELECT @VD_PSTG_D = max(TIME_DIMN.DATE_D)
    FROM TIME_DIMN
    WHERE TIME_DIMN.TME_DIMN_I IN ( 'TDTD', 'TDSH' );

    DECLARE @SQLString NVARCHAR(500); 
    SET @SQLString = CONCAT('Delete From RPT_STSTC Where TXN_PSTG_D =''', @VD_PSTG_D, ''' AND Rpt_i=''', @I_RPT_I, '''');
    Execute sp_executesql @SQLString, @vd_pstg_d, @I_Rpt_I;

    IF @@TRANCOUNT > 0
        COMMIT TRANSACTION;

【讨论】:

  • 谢谢比约格。第一个SQL中需要DECLARE @SQLString NVARCHAR(500);是什么?
  • @beckham 是我的错,我忘了删除它...我会更正
【解决方案2】:

:1 和 :2 是问题所在。

您想在其中填写变量,但这是错误的方式。您需要在那里使用变量,并且不能像在其他语言中那样使用占位符。

SET @SQLString = 'Delete From RPT_STSTC Where TXN_PSTG_D =  @vd_pstg_d and Rpt_i = @I_Rpt_I';

T-SQL 中不存在带有 :1 和 :2 的语法。

【讨论】:

    猜你喜欢
    • 2020-06-23
    • 2010-09-21
    • 1970-01-01
    • 2020-07-05
    • 2023-04-02
    • 2014-05-27
    • 1970-01-01
    • 2011-01-24
    • 2015-06-12
    相关资源
    最近更新 更多