使用 Dapper 将大型数组插入已声明的 SQL 服务器 table

Insert large array into a declared SQL Server table with Dapper

我有一个整数列表,我正在尝试使用 Dapper 将这些值插入临时 table,用 DECLARE 语句声明。我尝试了几种组合,但最终导致 Incorrect syntax near ',' 错误。

Dapper 甚至可以区分局部变量和 Dapper 查询参数,两者都带有 @ 前缀吗?

Fiddle

List<int> output = null;
        
List<int> input = new List<int> 
{
    1, 2, 3
};

var sql = @"DECLARE @tempTable TABLE (Id INT)
            INSERT INTO @tempTable VALUES (@Ids); 
                    
            SELECT * FROM @tempTable;";

using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServer()))
{
    output = connection.Query<int>(sql, new { Ids = input }).ToList();
}

请注意,输入列表可以大于 1000。

Dapper 会将列表转换为单独的参数,适合包含在 IN 谓词中,但不适用于 INSERT ... VALUES 查询。而是将值作为 JSON 传递,这对于大型列表来说也比使用单独的参数便宜得多。 EG

List<int> output = null;

List<int> input = new List<int>
    {
        1, 2, 3
    };

var sql = @"
DECLARE @tempTable TABLE (Id INT)
INSERT INTO @tempTable(id) select value from openjson( @Ids ); 
        
SELECT * FROM @tempTable;";

var inputJson = System.Text.Json.JsonSerializer.Serialize(input);

using (var con = new SqlConnection("server=localhost;database=tempdb;integrated security=true;trust server certificate=true")) 
{
    output = con.Query<int>(sql, new { Ids = inputJson }).ToList();
}