#sql #sql-server #tsql #asp-classic #ado
#sql #sql-сервер #tsql #asp-классический #ado
Вопрос:
У меня проблема с завершением сложного запроса:
SQLString = "SELECT i.CONCOM,
COALESCE(SUM(CASE
WHEN C.CATEGORY_ID = '30' THEN 0
ELSE t.LOGMINS END), 0) AS TotalWithoutNew,
COALESCE(SUM(t.LOGMINS), 0) AS TotalAllId
FROM Inquiry AS i
INNER JOIN TIMELOG AS t ON t.INQUIRY_ID = i.INQUIRY_ID
INNER JOIN PROD AS P ON i.PROD_ID = P.PROD_ID
INNER JOIN CATEGORY AS C ON P.CATEGORY_ID = C.CATEGORY_ID
WHERE (DATEPART(m, ESCDATE) = " amp; objmonth amp; ")
AND (DATEPART(y, ESCDATE) = " amp; objyear amp; ")
GROUP BY i.CONCOM
ORDER BY concom ASC"
Запрос отлично работает без предложения where, но когда я добавляю в него предложение where, оно ничего не возвращает. ESCDATE
является полем DATETIME. Сначала я подумал, что в него передаются не целые числа, а строки, и это определенно целые числа.
Далее в скрипте ASP, который я использую Request.Querystring
для получения месяца и года, и я в основном хочу проверить по дате ESC, что он возвращает результаты только за месяц, указанный в указанном году.
Комментарии:
1. Если есть индекс на
ESCDATE
, usingDATEPART
не сможет его использовать.2. Вы должны использовать параметризованные запросы. Если вы берете эти значения прямо из
Request.Querystring
и объединяете их в запросе, у вас возникнут проблемы с внедрением SQL.3. Чтобы подкрепить комментарий @ martin, проблема с sql-инъекцией является своего рода серьезной проблемой, и вы не должны ее игнорировать.
Ответ №1:
Спецификатор ‘y’ — это день года, а не year. Попробуйте вместо этого ‘yy’ или ‘гггг’.