私は最近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 のリストをインデックス付きテーブル変数 (テーブル変数が機能しない場合は一時テーブル) に挿入します。
- このテーブルを永続テーブルの 1 つに対して結合し、結果を返します。
私の意図は、WHERE IN (...) 句を使用してテーブルから選択するときのパフォーマンスの問題を解決することです