You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server存储过程修改后SCODE列未设为0的原因及修改方案咨询

问题解答

1. 修改后SCODE列未设为0的原因

  • 你之前修改的是针对[ax].myTable和@TVP_m的测试代码,但实际运行的存储过程是向[ax].RETAILTNS插入数据,且使用的表值参数是@TVP_S,你并没有修改存储过程中实际执行的INSERT语句。
  • 当前存储过程里的INSERT语句仍然是从@TVP_S中读取SCODE的值插入到目标表,所以无论你怎么改测试代码,实际运行的逻辑还是会沿用表值参数里的SCODE值。

2. 确保SCODE始终初始化为0的修改方案

直接修改存储过程中INSERT语句的SELECT部分,把读取@TVP_S.[SCODE]的地方替换成常量0即可,修改后的完整存储过程代码如下:

ALTER PROCEDURE [crt].[INSERTSA]
    @bId   BIGINT,
    @TVP_S [crt].[RETAILSTABLETYPEV2] READONLY
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @i_R     INT;
    DECLARE @i_T     INT;
    DECLARE @i_Error INT;

    SET @i_R = 0;
    SET @i_T = 0;

    IF @@TRANCOUNT = 0
    BEGIN
        BEGIN TRANSACTION;

        SELECT @i_Error = @@ERROR;

        IF @i_Error <> 0
        BEGIN
            SET @i_R = @i_Error;
            GOTO exit_label;
        END;

        SET @i_T = 1;
    END;

    -- 修改后的Insert语句:将SCODE固定为0
    INSERT INTO [ax].RETAILTNS ([AMOUNT], [SUM], [UNIT], [ID],
                                [DATE], [SCODE], [TIME], [CHANNEL])
        SELECT
            [AMOUNT], [SUM], [UNIT], [ID],
            [DATE], 0, [TIME], @bId  -- 这里把[SCODE]替换成0
        FROM @TVP_S AS Source;

    SELECT @i_Error = @@ERROR;

    IF @i_Error <> 0
    BEGIN
        SET @i_R = @i_Error;
        GOTO exit_label;
    END;

    IF @i_T = 1
    BEGIN
        COMMIT TRANSACTION;

        SET @i_Error = @@ERROR;

        IF @i_Error <> 0
        BEGIN
            SET @i_R = @i_Error;
            GOTO exit_label;
        END;

        SET @i_T= 0;
    END;

    exit_label:

    IF @i_T = 1
    BEGIN
        ROLLBACK TRANSACTION;
    END;

    RETURN @i_R;
END;

修改后,无论@TVP_S中SCODE列传入什么值,插入到[ax].RETAILTNS的SCODE都会被固定为0。

内容的提问来源于stack exchange,提问作者Roberto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 19:12:37