잘못된 쿼리 : 구문이 잘못되었습니다. ')

asp.net dapper sql-server-2008

문제

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

내가 응용 프로그램을 실행할 때 예외가 throw됩니다 : 잘못된 구문 근처 ')'

보시다시피 같은 날짜와 사용자를 가진 더 많은 티켓 (IEnumerable 유형)이있을 수 있습니다.

나는 무슨 일이 일어나고 있는지 잘 모르겠습니다.

수락 된 답변

그것은 유효한 SQL이 if 로 시작하지 못하기 때문입니다 (T-SQL을 사용 if 문 전체를 작성 if 합니다)

간단한 case 가 필요한 것이라고 생각합니다.

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

인기 답변

결과가 행 수와 SQL에서 리턴 된 결과가 아닌 경우 다음을 시도하십시오.

if exists ([whatever]) select 1

일치하는 값이 없으면 레코드 집합이 반환되지 않고 영향을받는 레코드 수가 0이기 때문에이 방법이 효과적입니다.

조금 더 간단한 것을 시도해 볼 수도 있습니다.

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

그러나 그것은 당신이 가지고있는 많은 레코드에 대해 하나의 레코드를 반환하는 단점이 있습니다. 앱과 컨텍스트에 따라 많은 문제가 발생할 수 있으며, 어떤 경우에는 사용하지 않을 데이터를 가져 오지 않으려 고합니다.

SELECT CASE EXISTS ([whatever]) THEN 1 END 가 하나의 레코드를 반환하고 레코드가없는 경우에도 영향을받는 레코드 수는 1이되므로 CASE 문은 권장하지 않습니다.

그건 그렇고 : 원래 SQL과 문제 : 성명은 불완전합니다. 당신은 "존재한다면 ..."이라고 말하고 있지만, "그때"와 동등한 것으로 끝내지는 않습니다. "if exists () select 1"또는 비슷한 것을 말해야합니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.