2017-11-08 14 views
-2
date = date.Date; 
     var query = [email protected]" SELECT t.Name AS 'Department or Division',c.RegistrationNumber AS 'Vehicle Registration Number' 
          ,v.Model + ' ' + v.Variant AS 'Model/ Vehicle Description',c.ChasisNumber AS 'VIN/ Chassis Number' 
          ,c.FirstRegistrationDate AS 'First Registration Date',Od.Reading AS 'Odometer Reading' 
          ,Od.ReadingDate AS 'Odometer Reading Date',Vc.Description as 'Vehicle Category' 
          FROM clientproductvehicles c JOIN Clients t 
          ON c.TargetClientId=t.ClientId JOIN Vehicles v 
          ON c.vehicleid=v.vehicleid JOIN VehicleCategories Vc 
          ON C.VehicleCategoryId=Vc.VehicleCategoryId LEFT JOIN OdometerReadings Od 
          ON C.Clientproductvehicleid=Od.ClientProductVehicleId 
          WHERE c.ClientId={clientId} 
          AND c.ProductId={productId} 
          AND (c.LastOdometerReading BETWEEN 14000 AND 20000 or c.LastOdometerReading BETWEEN 29000 AND 35000) 
          AND (convert(varchar(10), Od.ReadingDate,103) = convert(varchar(10), {date},103)) 
          AND (C.VehicleCategoryId = 1) 
          AND c.ClientProductVehicleId 
            NOT IN 
             (SELECT I.ClientProductVehicleId 
             FROM Incidents i 
             JOIN IncidentStates iSt 
             ON i.IncidentId = iSt.IncidentId 
             WHERE (i.CategoryId = 4 or i.Description LIKE '%km%') 
             AND IncidentStatusId = 1) 
             ORDER BY 'Odometer Reading Date' DESC"; 
     List<ClientProductVehicle> vehicleServiceDue = _moiFleetContext.Db.SqlQuery<ClientProductVehicle>(query).ToList(); 

私はこれらの範囲の間に走行距離計があり、それがIncidentsではないすべての車両のリストを取得しようとしています。System.Data.SqlClient.SqlException: '' 00 'で構文が正しくありません。'

私はそのエラーを受け取り続けます。なぜなら、私がSQLServer上でクエリを実行すると、どこからうまくいかなかったのか分かりません。

+1

ストアドプロシージャーが長すぎます。 –

+0

@ un-lucky誰が気にしますか?それがどのように問題を解決するのでしょうか? –

+2

問題を再現するために必要な最小限のクエリが得られるまで、クエリを行単位で絞り込みます。これはあまりにも大変です。 –

答えて

-1

クエリに複数の問題がある可能性があります。 1つの問題は次のとおりです。

ORDER BY 'Odometer Reading Date' 

SQL Serverでは、定数で注文することはできません。はい、これは定数であり、列への参照ではありません。

文字列と日付の定数には、一重引用符を使用する必要があります。 、いっそ

あるいは、

ORDER BY [Odometer Reading Date] 

エスケープする必要はありません名前与える(あなたが同様にSELECTでこれを行う必要があります。):カラム名をエスケープするために角括弧を使用し

ORDER BY Odometer_Reading_Date 
+0

これでエラーを解決することはできません。 –

+0

もう一つのエラーは 'convert(varchar(10)、{date}、103))'です。日付は引用符で囲まれていないので、SQLが壊れます。 – bradbury9

+0

{date}は、{clientId}と{productId}と同じパラメータを渡しています。 –

4

エラーは、この部分で最も可能性が高いです。convert(varchar(10), {date},103))

あなたは文字列を使用して、ここで.NET DateTimeオブジェクトに入れているinterpo Lation。問題は、適切な引用符を使用してテキストとして渡し、データベースの正しい日付/時刻形式(ローカルマシンではない)を使用する必要があることです。

この問題は、パラメータを使用する方がずっと簡単に解決できます。クエリで{date}の代わりに@dateを使用し、EFクエリ呼び出しでパラメータを渡します。

関連する問題