Ich habe ASP.NET-Anwendung und wir verwenden Dapper-Bibliothek. Der Code, der den Fehler erzeugt, sieht folgendermaßen aus:
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;
}
Wenn ich die Anwendung starte, gibt es die Ausnahme: Falsche Syntax in der Nähe von ')'
Wie Sie sehen, können mehr Tickets (IEnumerable-Typ) mit demselben Datum und demselben Benutzer vorhanden sein.
Ich bin mir nicht sicher, was los ist.
Das liegt daran, dass es kein gültiges SQL ist, mit einem if
zu beginnen (Wenn Sie T-SQL verwenden wollen, dann müssen Sie die gesamte if
Anweisung schreiben).
Ich denke, ein einfacher case
ist, was Sie brauchen:
select case
when exists (select * from T_TicketGroupsToChangePrice where SubTypeId = @SubTypeId and DateId = @dateId and UserId = @userId)
then 1
else 0
end
Wenn Ihr Ergebnis von der Anzahl der Zeilen und nicht davon abhängt, was aus dem SQL zurückgegeben wird, können Sie Folgendes versuchen:
if exists ([whatever]) select 1
Dies funktioniert, da, wenn keine übereinstimmenden Werte vorhanden sind, kein Recordset zurückgegeben wird und die Anzahl der betroffenen Datensätze null ist.
Sie könnten auch etwas einfacheres ausprobieren:
select 1
from T_TicketGroupsToChangePrice
where SubTypeId = @SubTypeId
and DateId = @dateId
and UserId = @userId;
Aber das hat den Nachteil, dass Sie eine Zeile für so viele Datensätze zurückgeben, die Sie haben. Je nach App und Kontext kann dies sehr viel sein, und auf keinen Fall möchten Sie Daten übertragen, die Sie nicht verwenden.
Ich würde eine CASE
Anweisung nicht empfehlen, da SELECT CASE EXISTS ([whatever]) THEN 1 END
immer noch einen Datensatz SELECT CASE EXISTS ([whatever]) THEN 1 END
, und die betroffene Datensatzanzahl wird 1 sein, auch wenn keine Datensätze vorhanden sind.
Das Problem mit Ihrem ursprünglichen SQL, übrigens: Die Aussage ist unvollständig. Sie sagen "wenn es existiert ...", aber Sie beenden es nie mit dem Äquivalent eines "dann". Sie müssen sagen "wenn vorhanden () wählen Sie 1" oder etwas ähnliches.