Dapper: insertar filas en variables de tabla

c# dapper insert sql table-variable

Pregunta

Últimamente he estado usando dapper y, en general, no tuve problemas con él, excepto cuando uso variables de tabla.

Para la demostración, utilizo un ejemplo modificado de este hilo .

Este código funciona sin problemas:

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

Pero esto no:

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

El único cambio es el uso de variables de tabla en lugar de tablas temporales ( @ instead # ). Dapper (o cualquier otra cosa en la cadena?) Parece mezclar esto de alguna manera con los parámetros y devuelve "Debe declarar la variable de tabla @t ".

¿Hay algo de malo en mi uso o es esta una característica error / faltante en dapper?

Saludos cordiales, Kc


ACTUALIZAR:

Solo para aclarar: @t no es un parámetro que establecerá dapper. @t se declara como una tabla local que solo existe para la consulta actualmente en ejecución. En mi opinión, dapper no debe distinguir entre ningún tipo de tabla, ya sea una tabla "normal", tabla temporal local / global o variable de tabla.

Un poco más de información de fondo:

Lo que realmente quiero hacer es:

  • Inserte una lista de Ids en una variable de tabla indexada (o tal vez una tabla temporal si las variables de tabla no funcionan)
  • ÚNASE a esta tabla en contra de una de mis tablas persistentes y devuelva el resultado.

Mi intención es vencer un problema de rendimiento al SELECCIONAR de mis tablas con una cláusula WHERE IN (...)

Respuesta popular

Si está utilizando SQL Server, la sintaxis es incorrecta. En SQL Server, las variables de la tabla no se crean de la misma manera que las tablas regulares. Debería ser así:

DECLARE @t TABLE (
   -- table definition
);


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow