存储过程需要参数“‘:’附近的语法不正确。”

问题描述 投票:0回答:2

我在 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 sql-server t-sql sql-server-2008 stored-procedures
2个回答
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;

0
投票

: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
语法。

© www.soinside.com 2019 - 2024. All rights reserved.