Consulta incorrecta: sintaxis incorrecta cerca de ')'

asp.net dapper sql-server-2008

Pregunta

Tengo una aplicación ASP.NET y utilizamos la biblioteca Dapper. El código que produce el error se ve de la siguiente manera:

public bool CheckIfExists(IEnumerable<long> ticketGroups, long dateId, int userId)
{
    bool bRetVal = false;
    string sql = "if exists (select * from T_TicketGroupsToChangePrice where SubTypeId = @SubTypeId and DateId = @dateId and UserId = @userId)";
    using (var conn = CreateSqlConnection())
    try
    {
        int rows = conn.Execute(sql, ticketGroups.Select(g => new { SubTypeId = g, UserId = userId, dateId }));
        if (rows > 0)
            bRetVal = true;
    }
    catch (SqlException ex)
    {
        throw new Exception("Error", ex);
    }

    return bRetVal;
}

Cuando ejecuto la aplicación arroja la excepción: sintaxis incorrecta cerca de ')'

Como puede ver, puede haber más tickets (tipo IEnumerable) con la misma fecha y usuario.

No estoy seguro de lo que está pasando.

Respuesta aceptada

Esto se debe a que no es un SQL válido para comenzar con un if (si quiere usar T-SQL es así, pero luego tiene que escribir el enunciado if completo)

Creo que un simple case es lo que necesitas:

select case
       when exists (select * from T_TicketGroupsToChangePrice where SubTypeId = @SubTypeId and DateId = @dateId and UserId = @userId)
       then 1
       else 0
       end

Respuesta popular

Si su resultado depende del número de filas y no de lo que devuelve el SQL, puede intentar esto:

if exists ([whatever]) select 1

Esto funciona, porque si no hay valores coincidentes, no se devuelve ningún conjunto de registros y el recuento de registros afectados es cero.

También puedes intentar algo un poco más simple:

select 1 
from T_TicketGroupsToChangePrice 
where SubTypeId = @SubTypeId 
  and DateId = @dateId 
  and UserId = @userId;

Pero eso tiene la desventaja de devolver una fila por todos los registros que tenga. Esto podría ser mucho, dependiendo de la aplicación y el contexto, y en cualquier caso no desea tirar de los datos que no va a utilizar.

No recomendaría una declaración CASE , porque SELECT CASE EXISTS ([whatever]) THEN 1 END aún devolverá un registro, y su recuento de registros afectados será 1 incluso si no existen registros.

El problema con su SQL original, por cierto: la declaración es incompleta. Estás diciendo "si existe ..." pero nunca lo terminas con el equivalente de "entonces". Debe decir "si existe () seleccione 1" o algo similar.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué