5

私は最近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 (...) 句を使用してテーブルから選択するときのパフォーマンスの問題を解決することです

4

3 に答える 3