我有ASP.NET应用程序,我们使用Dapper库。产生错误的代码如下所示:
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;
}
当我运行应用程序时,它会抛出异常:')'
附近的语法不正确正如您所看到的,可以有更多具有相同日期和用户的票证(IEnumerable类型)。
我不确定发生了什么。
答案 0 :(得分:8)
那是因为以if
开头是无效的SQL(如果你的意思是使用T-SQL,那么你必须编写整个if
语句)
我认为你需要一个简单的case
:
select case
when exists (select * from T_TicketGroupsToChangePrice where SubTypeId = @SubTypeId and DateId = @dateId and UserId = @userId)
then 1
else 0
end
答案 1 :(得分:0)
您的查询&#34; 如果存在(从T_TicketGroupsToChangePrice中选择*,其中SubTypeId = @SubTypeId和DateId = @dateId和UserId = @userId)&#34;如果表有一些数据,则返回一些数据,因为它需要处理一些事情。就像编程中的if else条件一样,我们可以将其修改为:
if exists
(select * from T_TicketGroupsToChangePrice where SubTypeId = @SubTypeId and DateId = @dateId and UserId = @userId)
Print 'Have Data'
else
Print 'Don't Have data'
重写代码:
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) Print '**your code to execute if exist data**' else Print '**your code to execute if doesnot exist data**'";
using (var conn = CreateSqlConnection())
try
{
int rows = conn.Execute(sql, ticketGroups.Select(g => new { SubTypeId = g, UserId = userId, DateId = dateId }));
if (rows > 0)
bRetVal = true;
}
catch (SqlException ex)
{
throw new Exception("Error", ex);
}
return bRetVal;
}
此链接将为您提供更多帮助: https://dba.stackexchange.com/questions/30159/exist-select-from-my-table
答案 2 :(得分:0)
如果您的结果取决于行数而不是从SQL返回的内容,您可以尝试这样做:
if exists ([whatever]) select 1
这样可行,因为如果没有匹配的值,则不会返回记录集,并且您的受影响记录数为零。
你也可以尝试一些更简单的事情:
select 1
from T_TicketGroupsToChangePrice
where SubTypeId = @SubTypeId
and DateId = @dateId
and UserId = @userId;
但是这样做的缺点是,无论你有多少记录都会返回一行。这可能很多,取决于应用程序和上下文,并且在任何情况下,您都不想提取您将不会使用的数据。
我不建议使用CASE
语句,因为SELECT CASE EXISTS ([whatever]) THEN 1 END
仍然会返回一条记录,即使没有记录,您的受影响记录数也会为1。
原始SQL的问题,顺便说一句:语句不完整。你在说&#34;如果存在......&#34;但你永远不会用相当于&#34;然后&#34;完成它。你需要说&#34;如果exists()选择1&#34;或类似的东西。