2015-03-30 1 views
0

При попытке выполнить оператор SQL ниже, когда указал на SQL Server Express я получаю сообщение об ошибкеОшибка: идентификатор, который начинается с ... Максимальная длина составляет 128

The identifier that starts with 'Select * FROM AvailabilityBlocks LEFT JOIN Location ON AvailabilityBlocks.LocationID=Location.LocationID WHERE ((AvailabilityBlo' is too long. Maximum length is 128." Error.

SQL код:

SELECT * 
FROM 
    (Resources 
LEFT JOIN 
    [Select * 
    FROM AvailabilityBlocks 
    LEFT JOIN 
     Location ON AvailabilityBlocks.LocationID = Location.LocationID 
    WHERE 
     ((AvailabilityBlocks.LocationID IN (8, 14, 16, 31, 1, 15, 17, 10, 9, 19, 12, 30, 5, 18, 13, 20, 3, 26, 2, 25, 28, 27, 32, 33) 
     AND (AvailabilityBlocks.Type = 3 OR AvailabilityBlocks.Type = 4)) 
      OR AvailabilityBlocks.Type = 2) 
     AND [Begin] < '06-Apr-2015 12:00:00 AM' 
     AND [Begin] >= '30-Mar-2015 12:00:00 AM' 
     AND (WeekDay([Begin]) = 2 OR WeekDay([Begin]) = 3 
      OR WeekDay([Begin]) = 4 OR WeekDay([Begin]) = 5 
      OR WeekDay([Begin]) = 6 OR WeekDay([Begin]) = 7)]. AS FilteredTable ON Resources.ResourceID = FilteredTable.ResourceID) 
LEFT JOIN 
    EmployeeTypes ON EmployeeTypes.TypeID = Resources.EmployeeType 
ORDER BY 
    RClass, Resources.LastName ASC, Resources.FirstName ASC, 
    Resources.ResourceID ASC, [AvailabilityBlocks.Begin] ASC, 
    [AvailabilityBlocks.End] Desc, Location.SubType DESC 

Этот SQL отлично работает при выполнении с БД доступа. Может ли кто-нибудь предложить какие-либо предложения?

Заранее спасибо

+3

Попробуйте заменить скобки в этих местах 'LEFT JOIN [..' с круглыми скобками. –

+0

Обратите внимание, что вы не должны делать выбор *, если таблицы имеют одинаковые имена. Выберите столбцы, которые вы хотите увидеть. – TYY

+0

У меня возникла ошибка: идентификатор, начинающийся с '46, 65,29,76,21,13,53,63,26,78,49,79,14,15,54,55,16,17,38 , 80,59,39,62,56,5,6,11,12,35,60,72,34,69,7,8,71,66,47,36,67,43,41,42,44 , 'слишком длинный. Максимальная длина - 128. Но я использовал только круглые скобки в своем коде. В моем списке местоположений есть около 100 идентификаторов местоположения, а после 44 лет он дает ошибку! –

ответ

0

Вы использовали [вместо (для указанного подзапроса. Я установил его ниже и добавил немного структуры для удобства чтения.

SELECT * FROM 
Resources 
    LEFT JOIN 
    (Select * FROM AvailabilityBlocks 
     LEFT JOIN Location ON AvailabilityBlocks.LocationID=Location.LocationID 
     WHERE ((AvailabilityBlocks.LocationID IN (8, 14, 16, 31, 1, 15, 17, 10, 9, 19, 12, 30, 5, 18, 13, 20, 3, 26, 2, 25, 28, 27, 32, 33) 
     AND (AvailabilityBlocks.Type = 3 OR AvailabilityBlocks.Type = 4)) OR AvailabilityBlocks.Type = 2) 
     AND [Begin] < '06-Apr-2015 12:00:00 AM' 
     And [Begin] >= '30-Mar-2015 12:00:00 AM' 
     AND (WeekDay([Begin])=2 
      OR WeekDay([Begin])=3 
      OR WeekDay([Begin])=4 
      OR WeekDay([Begin])=5 
      OR WeekDay([Begin])=6 
      OR WeekDay([Begin])=7)) AS FilteredTable 
     ON Resources.ResourceID=FilteredTable.ResourceID 
    LEFT JOIN EmployeeTypes ON EmployeeTypes.TypeID=Resources.EmployeeType 
ORDER BY RClass, Resources.LastName ASC, Resources.FirstName ASC, Resources.ResourceID ASC, AvailabilityBlocks.[Begin] ASC, AvailabilityBlocks.[End] Desc, Location.SubType DESC 
+0

Если мы делаем вещи для удобочитаемости ... '" Начать "<'2015-04-06' - формат ГГГГ-ММ-ДД, всегда!' 'И WeekDay (« Начать ») IN (2, 3, 4, 5, 6, 7) ' – gvee

+1

Я предполагаю, что вы меня там :) – Randall

+0

Спасибо за быстрые ответы, но, к сожалению, этот SQL все равно не будет запущен, новая ошибка: – user1801904

0

Там несколько вещей с ваш запрос. Я дам вам то, что, как я думаю, должно выглядеть так, но я считаю, что вам также нужно выяснить, как разбить ваш запрос, чтобы выяснить, что не так.

Прежде всего, убедитесь, что внутренний запрос в вашем левом соединении работы:

SELECT ab.* -- Note Here I only select ab.*, if you need any columns from Location then do loc. "column needed" 
    FROM AvailabilityBlocks ab 
    LEFT JOIN Location loc ON ab.LocationID = loc.LocationID 
    WHERE 
     ((ab.LocationID IN (8, 14, 16, 31, 1, 15, 17, 10, 9, 19, 12, 30, 5, 18, 13, 20, 3, 26, 2, 25, 28, 27, 32, 33) 
      AND (ab.Type = 3 OR ab.Type = 4)) 
      OR ab.Type = 2) 
     AND ab.Begin BETWEEN CAST('20150330' AS DATE) AND CAST('20150406' AS DATE) 
     AND (WeekDay([Begin]) IN (2,3,4,5,6,7) 

Теперь, как только вы убедитесь, что верхний запрос работает, вы можете встроить этот внутренний рабочий запрос в левой присоединиться (я предполагаю, что большинство из колонн находятся в пределах блоков доступности, если ResourceId не добавить его с помощью Loc.ResourceID).

SELECT r.*,et.* , FilteredTable.Begin, FilteredTable.End, FilteredTable.SubType 
FROM Resources r 
LEFT JOIN 
    (
     SELECT ab.* 
     FROM AvailabilityBlocks ab 
     LEFT JOIN Location loc ON ab.LocationID = loc.LocationID 
     WHERE 
      ((ab.LocationID IN (8, 14, 16, 31, 1, 15, 17, 10, 9, 19, 12, 30, 5, 18, 13, 20, 3, 26, 2, 25, 28, 27, 32, 33) 
       AND (ab.Type = 3 OR ab.Type = 4)) 
       OR ab.Type = 2) 
      AND ab.Begin BETWEEN CAST('20150330' AS DATE) AND CAST('20150406' AS DATE) 
      AND (WeekDay([Begin]) IN (2,3,4,5,6,7) 
    )AS FilteredTable ON r.ResourceID = FilteredTable.ResourceID 
LEFT JOIN EmployeeTypes et ON et.TypeID = r.EmployeeType 

Наконец в «порядок по» пункту использовать соответствующий псевдоним, а не имена таблиц

ORDER BY 
    RClass, -- What table has this? 
    r.LastName ASC, 
    r.FirstName ASC, 
    r.ResourceID ASC, 
    FilteredTable.Begin ASC, 
    FilteredTable.End Desc, 
    FilteredTable.SubType DESC 

Будучи в состоянии разорвать ваши запросы, чтобы увидеть, что является причиной вам проблем является ключом к выяснить, что существуют другие проблемы (что не означает, что решения для людей дадут вам ответ, а скорее помогут вам разобраться с решением самостоятельно)

Смежные вопросы