使用 Dapper 将大型数组插入已声明的 SQL 服务器 table
Insert large array into a declared SQL Server table with Dapper
我有一个整数列表,我正在尝试使用 Dapper 将这些值插入临时 table,用 DECLARE 语句声明。我尝试了几种组合,但最终导致 Incorrect syntax near ','
错误。
Dapper 甚至可以区分局部变量和 Dapper 查询参数,两者都带有 @
前缀吗?
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();
}
我有一个整数列表,我正在尝试使用 Dapper 将这些值插入临时 table,用 DECLARE 语句声明。我尝试了几种组合,但最终导致 Incorrect syntax near ','
错误。
Dapper 甚至可以区分局部变量和 Dapper 查询参数,两者都带有 @
前缀吗?
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();
}