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
相关产品推荐
相关产品推荐

