Dapper: inserimento di righe in variabili di tabella

c# dapper insert sql table-variable

Domanda

ultimamente ho usato dapper e tutto sommato non ha avuto problemi se non usando variabili di tabella.

Per la dimostrazione, uso un esempio modificato da questo thread .

Questo codice funziona senza problemi:

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"}
    });

Ma questo non:

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"}
    });

L'unica modifica è l'uso di variabili di tabella, invece tabelle temporanee ( @ instead # ). Dapper (o qualsiasi altra cosa nella catena?) Sembra in qualche modo mescolare questo con parametri e restituisce "Devi dichiarare la variabile di tabella @t ".

C'è qualcosa di sbagliato nel mio utilizzo o si tratta di un bug / funzionalità mancante in dapper?

Cordiali saluti, Kc


AGGIORNARE:

Giusto per chiarire: @t non è un parametro da impostare dapper. @t è dichiarato come tabella locale che esiste solo per la query attualmente in esecuzione. A mio parere, dapper non dovrebbe distinguere tra nessun tipo di tabella, sia essa una "normale", una tabella temporanea locale o globale o una variabile di tabella.

Un po 'più di informazioni di base:

Quello che voglio veramente fare è:

  • Inserire un elenco di Id in una variabile di tabella indicizzata (o magari una tabella temporanea se le variabili di tabella non funzionano)
  • UNISCITI a questa tabella contro una delle mie tabelle persistenti e restituisci il risultato.

La mia intenzione è quella di sconfiggere un problema di prestazioni quando SELEZIONA dalle mie tabelle con una clausola WHERE IN (...)

Risposta popolare

Se si utilizza SQL Server, la sintassi non è corretta. In SQL Server, le variabili di tabella non vengono create allo stesso modo delle normali tabelle. Dovrebbe essere così:

DECLARE @t TABLE (
   -- table definition
);


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow