在我看来,FROM子句中的参数扩展仅适用于某些参数类型。尝试使用字符串数组参数运行查询时,运行以下代码段将引发以下异常System.Data.SqlClient.SqlException: 'Incorrect syntax near ','.'
。
using (var conn = new SqlConnection(_connectionString))
{
conn.Open();
var sql = "SELECT ids.id FROM @ids ids (id)";
conn.Query(sql, new { ids = new[] { 1, 2, 3, 4, 5 } }); // This works perfectly
conn.Query(sql, new { ids = new[] { "1", "2", "3", "4", "5" } // This query throws an exception
}
我一直在努力寻找有关此类参数扩展的任何文档,所以我的问题是我是否闯入了未记录的部分受支持的功能(也许是通过滥用参数扩展),还是这是一个错误? / p>
答案 0 :(得分:1)
根据Zohar的提示,我创建了一个xe会话来捕获dapper运行的语句。对于字符串列表参数,参数扩展的处理方式确实有所不同
-- first query
exec sp_executesql N'SELECT ids.id FROM (select cast([value] as int) from string_split(@ids,'','')) ids (id)',N'@ids varchar(max) ',@ids='1,2,3,4,5'
-- second query
exec sp_executesql N'SELECT ids.id FROM (@ids1,@ids2,@ids3,@ids4,@ids5) ids (id)',N'@ids1 nvarchar(4000),@ids2 nvarchar(4000),@ids3 nvarchar(4000),@ids4 nvarchar(4000),@ids5 nvarchar(4000)',@ids1=N'1',@ids2=N'2',@ids3=N'3',@ids4=N'4',@ids5=N'5'
两个扩展模式都为WHERE IN
子句生成有效的语法,但不能为FROM
子句生成有效的语法。因此,最后,FROM
子句中对参数扩展的部分支持似乎是由于滥用框架导致的。