将DataTable传入带表值参数的SQL存储过程时遇无数据问题
问题分析与解决
核心原因:未在存储过程调用中传递参数
你的代码里ExecuteSqlRaw的执行语句没有把定义好的表值参数传递给存储过程,导致存储过程根本接收不到数据。正确的调用需要在EXEC语句里指定参数:
var response = this.Database.ExecuteSqlRaw("EXEC [dbo].[sp_InsertStagingData] @TVP_StagingData", parameter);
其他可能的排查点
如果修正后还是有问题,检查以下几点:
- DataTable列与表值类型匹配:确保
DataTable的列名、数据类型、顺序和SQL Server中dbo.dataType表值类型的定义完全一致,包括大小写(SQL Server默认不区分,但严格匹配更稳妥)。 - 表值类型存在性:确认
dbo.dataType在目标数据库中已正确创建,架构(dbo)无误。 - DataTable行状态:确保
DataTable中的行不是Deleted状态,只有Added或Unchanged状态的行才会被传递到SQL Server。 - 参数名称一致性:存储过程的参数名称必须和你定义的
@TVP_StagingData完全一致,包括前缀@。
验证方法
可以在存储过程里添加日志输出,确认参数接收情况:
CREATE PROCEDURE [dbo].[sp_InsertStagingData] @TVP_StagingData dbo.dataType READONLY AS BEGIN -- 记录参数行数到日志表(需提前创建LogTable) INSERT INTO LogTable (LogMessage, CreateTime) SELECT 'Received TVP rows: ' + CAST(COUNT(*) AS VARCHAR(10)), GETDATE() FROM @TVP_StagingData; -- 原有业务逻辑 -- ... END
内容的提问来源于stack exchange,提问作者kdubbers
相关产品推荐
相关产品推荐

