我最近一直在使用dapper,除了使用表变量之外,总的来说没有任何问题。
为了演示,我使用了这个线程中的一个修改示例。
此代码可以正常工作:
int tally = connection.Execute(
"create table #t(Name nvarchar(max), Age int)\n" +
"insert #t (Name,Age) values(@Name, @Age)", new[]
{
new {Age = 1, Name = "sam"},
new {Age = 2, Name = "bob"}
});
但这不会:
int tally = connection.Execute(
"create table @t(Name nvarchar(max), Age int)\n" +
"insert @t (Name,Age) values(@Name, @Age)", new[]
{
new {Age = 1, Name = "sam"},
new {Age = 2, Name = "bob"}
});
唯一的变化是使用表变量而不是临时表 ( @ instead #
)。Dapper(或链中的其他任何东西?)似乎以某种方式将其与参数混合并返回“必须声明表变量@t
”。
我的使用有什么问题吗,或者这是dapper 中的错误/缺失功能?
最好的问候, Kc
更新:
只是为了澄清:@t
不是由 dapper 设置的参数。@t
被声明为仅对当前运行的查询存在的本地表。在我看来,dapper 不应该区分任何类型的表,无论是“普通”表、本地/全局临时表还是表变量。
更多背景信息:
我真正想做的是:
- 将 Id 列表插入索引表变量(或者如果表变量不起作用,则可能是临时表)
- 针对我的一个持久表加入这个表并返回结果。
我的目的是在使用 WHERE IN (...) 子句从我的表中进行 SELECT 时解决性能问题