使用Table-Valued parameter的IN子句返回全表数据而非指定值问题排查
排查Table-Valued Parameter(TVP)配合IN子句返回全表数据的问题
核心问题出在存储过程的子查询字段匹配错误:
你创建的TVP类型StringsList定义的列名是Id,但在存储过程的WHERE子句里,你从@ListIds中查询的是MASTER_CUSTOMER_ID——这个字段在TVP里根本不存在,导致子查询返回的是NULL集合。当[MASTER_CUSTOMER_ID] IN (NULL)时,数据库对每一行的判断结果都是UNKNOWN,不会过滤任何数据,最终返回了全表的12万条记录。
修正后的存储过程代码
CREATE OR ALTER PROCEDURE [dbo].[GetMemberInfoAndMemberSubscriptions] ( @ListIds StringsList READONLY) AS BEGIN SELECT [MASTER_CUSTOMER_ID], USR_SPE_Membership_Status FROM CUSTOMER WHERE [MASTER_CUSTOMER_ID] IN (SELECT [Id] FROM @ListIds) END
额外验证点
- 你的C#代码中DataTable的列名
Id和TVP的列名完全匹配,这部分是正确的,不需要修改 - 可以在存储过程里先执行
SELECT * FROM @ListIds验证传入的6个ID是否正确传入,确认数据无误后再关联查询
内容的提问来源于stack exchange,提问作者James123
相关产品推荐
相关产品推荐

