我在 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。你可以重写它:
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;
: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
语法。