2009-09-23 6 views
1

У меня есть классическая страница ASP, которая позволяет пользователям искать свойства и страницу результатов, которая затем отправляет письма агентам свойств, которые имеют соответствующие свойства, чтобы сообщить им, что арендаторы заинтересованы в их свойствах.Неверный синтаксис рядом с ключевым словом «SELECT»

Некоторые агенты могут иметь более 1 собственности, и в этом случае агенту требуется только 1 электронное письмо, а не электронное письмо для каждой имеющейся у них собственности.

Я проверил следующий запрос в Management Studio и вернул правильные результаты;

SELECT DISTINCT CustomerEmail 
FROM   (SELECT  ContentID 
         FROM   (SELECT  ContentID 
               FROM   VWTenantPropertiesResults 
               WHERE  (ContentStreet = '') 
               UNION ALL 
               SELECT  ContentID 
               FROM   VWTenantPropertiesResults AS VWTenantPropertiesResults_2 
               WHERE  (ContentTown = 'Hull') 
               UNION ALL 
               SELECT  ContentID 
               FROM   VWTenantPropertiesResults AS VWTenantPropertiesResults_1 
               WHERE  (ContentPostCode = 'HU7')) AS qi 
         GROUP BY ContentID 
         HAVING  (COUNT(*) >= 2)) AS q INNER JOIN 
         VWTenantPropertiesResults AS r ON r.ContentID = q.ContentID 
WHERE  (r.ContentBedRooms BETWEEN 1 AND 4) AND (r.ContentPrice BETWEEN 50 AND 500) 

Однако, когда я запускаю следующий код на странице он возвращает ошибку Неправильный синтаксис около ключевого слова «SELECT»;

rsemailagents.Source = "SELECT DISTINCT CustomerEmail" 
rsemailagents.Source = rsemailagents.Source& "FROM (" 
rsemailagents.Source = rsemailagents.Source& "  SELECT ContentID" 
rsemailagents.Source = rsemailagents.Source& "  FROM (" 
rsemailagents.Source = rsemailagents.Source& "    SELECT ContentID" 
rsemailagents.Source = rsemailagents.Source& "    FROM VWTenantPropertiesResults" 
rsemailagents.Source = rsemailagents.Source& "    WHERE ContentStreet = '" & Replace(rspropertyresults__varReqStreet, "'", "''") & "'" 
rsemailagents.Source = rsemailagents.Source& "    UNION ALL" 
rsemailagents.Source = rsemailagents.Source& "    SELECT ContentID" 
rsemailagents.Source = rsemailagents.Source& "    FROM VWTenantPropertiesResults" 
rsemailagents.Source = rsemailagents.Source& "    WHERE ContentTown = '" & Replace(rspropertyresults__varReqTown, "'", "''") & "'" 
rsemailagents.Source = rsemailagents.Source& "    UNION ALL" 
rsemailagents.Source = rsemailagents.Source& "    SELECT ContentID" 
rsemailagents.Source = rsemailagents.Source& "    FROM VWTenantPropertiesResults" 
rsemailagents.Source = rsemailagents.Source& "    WHERE ContentTrimmedPostCode LIKE '" & Replace(varPostcode, "'", "''") & "%'" 
rsemailagents.Source = rsemailagents.Source& "    ) qi" 
rsemailagents.Source = rsemailagents.Source& "  GROUP BY" 
rsemailagents.Source = rsemailagents.Source& "    ContentID" 
rsemailagents.Source = rsemailagents.Source& "  HAVING COUNT(*) >= 2" 
rsemailagents.Source = rsemailagents.Source& "  ) q " 
rsemailagents.Source = rsemailagents.Source& "JOIN VWTenantPropertiesResults r " 
rsemailagents.Source = rsemailagents.Source& "ON  r.ContentID = q.ContentID " 
rsemailagents.Source = rsemailagents.Source& "WHERE ContentBedrooms BETWEEN " & Replace(rspropertyresults__varBedroomsNoMin, "'", "''") & " " 
rsemailagents.Source = rsemailagents.Source& "AND  " & Replace(rspropertyresults__varBedroomsNoMax, "'", "''") & " " 
rsemailagents.Source = rsemailagents.Source& "AND  ContentPrice BETWEEN " & Replace(rspropertyresults__varPriceMin, "'", "''") & " " 
rsemailagents.Source = rsemailagents.Source& "AND  " & Replace(rspropertyresults__varPriceMax, "'", "''") & " " & varSQL & " " 

Я задавался вопросом, есть ли у кого-нибудь идеи о том, почему DISTINCT не будет работать в коде?

спасибо.

+0

Попробуйте распечатать rsemailagents.Source и сравните с запросом, который вы протестировали в Management Studio –

+0

Вы также должны увидеть SQL, который отправляется на сервер, который будет выполнен с использованием SQL Profiler. Получите текстовые данные и попробуйте запустить его в SSMS –

ответ

5

Поместите пробел в строке в конце этой линии

изменение

rsemailagents.Source = "SELECT DISTINCT CustomerEmail" 

к этому

rsemailagents.Source = "SELECT DISTINCT CustomerEmail " 
+0

Эй, ребята, спасибо, что нашли проблему с пространством. Не могу поверить, как долго я просматривал этот код. Мне нужен перерыв. Лол. По какой-то причине он по-прежнему отправляет несколько копий электронной почты на каждый адрес электронной почты. :( – doubleplusgood

+0

Я бы предложил открыть это как отдельный вопрос, чтобы избежать аннулирования ответов, которые у вас уже есть. – JohnFx

2
rsemailagents.Source = "SELECT DISTINCT CustomerEmail" 

там должен быть пробел за электронной почтой Клиента.

rsemailagents.Source = "SELECT DISTINCT CustomerEmail " 
2

Я не читал весь материал, но в конце первой линии, пространство :-) отсутствует

я считаю, что проще добавить пробела в начале каждой строки, потому что вы можете легко увидеть, нет ли этого или нет. Конечно, это все еще уродливый код, как всегда, когда выставляете sql-выражения вместе.

0

Существуют различия между кодом SQL, который вы показали, и тем, что делает код ASP. Вы должны вывести код со страницы ASP, чтобы узнать, что происходит.

В предложении LIKE есть только одна цитата, перед символом%.