Как обойти SQL Server «Превышено максимальное количество таблиц в запросе (260)». - PullRequest
2 голосов
/ 06 мая 2011

У меня есть запрос, который содержит серию из 21 UNIONs, например ::

CREATE VIEW dbo.USGovCurrencyOnHandBreakdown AS

   SELECT ... FROM a
   UNION ALL
   SELECT ... FROM b
   UNION ALL
   SELECT ... FROM c
   UNION ALL
   SELECT ... FROM d
   ...
   UNION ALL
   SELECT ... FROM u

Запрос выполняется нормально, когда выполняется один. Но когда запрос выполняется через содержащее представление:

SELECT * FROM USGovCurrencyOnHandBreakdown 

Msg 4414, Level 16, State 1, Line 1
Could not allocate ancillary table for view or function resolution. The maximum number of tables in a query (260) was exceeded.

Я пытался разделить мой USGovFedExpentiures вид на более мелкие куски:

CREATE VIEW dbo.USGovCurrencyOnHandBreakdown AS

   SELECT x FROM TreasuryAuditResults
   UNION ALL
   SELECT x FROM USGovCurrencyOnHandBreakdown_Additions
   UNION ALL
   SELECT x FROM USGovCurrencyOnHandBreakdown_Subtractions

С USGovCurrencyOnHandBreakdown_Additions и USGovCurrencyOnHandBreakdown_Subtractions, каждый из которых содержит примерно половину запросов:

CREATE VIEW USGovCurrencyOnHandBreakdown_Additions AS
   SELECT ... FROM b
   UNION ALL
   SELECT ... FROM c
   ...
   SELECT ... FROM k

CREATE VIEW USGovCurrencyOnHandBreakdown_Subtractions AS
   SELECT ... FROM l
   UNION ALL
   SELECT ... FROM m
   ...
   SELECT ... FROM u

Но выбор из представления " parent " по-прежнему завершается неудачей:

SELECT * FROM USGovCurrencyOnHandBreakdown

Msg 4414, Level 16, State 1, Line 1
Could not allocate ancillary table for view or function resolution. The maximum number of tables in a query (260) was exceeded.

Как мне обойти ограничение в 256 таблиц?

Смотри также

Ответы [ 2 ]

3 голосов
/ 07 мая 2011

Коллега придумал отличный ответ.Используйте функцию для возврата табличной переменной;вставьте результаты в переменную таблицы по битам:

CREATE VIEW dbo.USGovCurrencyOnHandBreakdown AS
    SELECT * FROM fn_USGovCurrencyOnHandBreakdown()

, и теперь представление вызывает UDF:

CREATE FUNCTION dbo.fn_USGovCurrencyOnHandBreakdown()
    RETURNS @Results TABLE
    (
        Total money, 
        ...
    )

    INSERT INTO @Results SELECT ... FROM a
    INSERT INTO @Results SELECT ... FROM b
    INSERT INTO @Results SELECT ... FROM c
    INSERT INTO @Results SELECT ... FROM d
      ...
    INSERT INTO @Results SELECT ... FROM u

    RETURN 
END

Насколько известно любому клиенту, view не изменяется.(За исключением того, что теперь это работает!)

0 голосов
/ 06 мая 2011

Вы можете сохранить подзапросы во временных таблицах, например, USGovCurrencyOnHandBreakdown_Additions и USGovCurrencyOnHandBreakdown_Subtractions, которые вы упомянули, и затем выбирать из этих временных таблиц вместо представлений.

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

...