Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    338

    SQL Server: errore in una vista - troppe tabelle

    Ciao, ho un problema in una vista che sto preparando su SQL Server 2000. Quando la verifico mi si presenta il seguente messaggio:

    Could not allocate ancillary table for view or function resolution. The maximum number of tables in a query (260) was exceeded.
    Dalla documentazione MS sembra che il numero massimo di tabelle cui si fa riferimento in una vista sia di 260, anche considerando tabelle cui ci si riferisce tramite viste incluse in quella di partenza, però facendo il conto non capisco xchè nel mio caso avvenga l' errore.

    http://support.microsoft.com/default...b;en-us;818406

    A SELECT Transact-SQL statement can reference a maximum of 256 tables. This limit includes the table and the views that are referenced in the statement. The limit also includes the tables and the views that are referenced by a view that is included in the query. Therefore, if a table or a view is referenced more than one time in the query, each reference to the table or the view (or the tables and views that are referenced in the view) counts against this limit.
    codice vista principale:
    codice:
    SELECT     *
    FROM         (         SELECT     *
                           FROM         vista1
                           UNION ALL
                           SELECT     *
                           FROM         vista2
                           UNION ALL
                           SELECT     *
                           FROM         vista3
                           UNION ALL
                           SELECT     *
                           FROM         vista4
                           UNION ALL
                           SELECT     *
                           FROM         vista5
                           UNION ALL
                           SELECT     *
                           FROM         vista6
                           UNION ALL
                           SELECT     *
                           FROM         vista7
                           UNION ALL
                           SELECT     *
                           FROM         vista8
                           UNION ALL
                           SELECT     *
                           FROM         vista9
                           UNION ALL
                           SELECT     *
                           FROM         vista10
                           UNION ALL
                           SELECT     *
                           FROM         vista11
                           UNION ALL
                           SELECT     *
                           FROM         vista12
                           UNION ALL
                           SELECT     *
                           FROM         vista13
                           UNION ALL
                           SELECT     *
                           FROM         vista14
                           UNION ALL
                           SELECT     *
                           FROM         vista15
                           UNION ALL
                           SELECT     *
                           FROM         vista16
                           UNION ALL
                           SELECT     *
                           FROM         vista17
                           UNION ALL
                           SELECT     *
                           FROM         vista18
                           UNION ALL
                           SELECT     *
                           FROM         vista19
                           UNION ALL
                           SELECT     *
                           FROM         vista20) AS dati
    WHERE     (campo1 IN ('val1', 'val2', 'val3', 'val4', 'val5', 'val6', 'val7', 'val8', 
                          'val9'))
    ogni vista secondaria fa riferimento a 2 sole tabelle contenute in database diversi (20 in tutto)

    vista 1:

    codice:
    SELECT     'tab1' AS PROVENIENZA, r.field1 AS Alias1, py.field2 AS Alias2, py.field3 AS Alias3, py.field4 AS Alias4,
                           py.field5 AS Alias5, py.field6 AS Alias6, py.field7 AS Alias7, py.field8 AS Alias8, 
                          py.field9 AS Alias9, py.field10 AS Alias10, py.field11 AS Alias11
    FROM         tabella1 AS py INNER JOIN
                          tabella2 AS r ON py.fieldjoin = r.fieldjoin
    WHERE     (r.field1 IS NOT NULL)
    mi sembra che in tutto io usi 20 * 2 = 40 tabelle, x cui...

    ------

    ooops :rollo: scoperto l'inghippo..

    la vista1 fa riferimento ad 1 tabella r e ad una vista ptv (non me ne ero accorto!) che a sua volta si richiama a 14 tabelle!!

    quindi 20 * (1 + 14) = 300 > 260

    lascio cmq il post a futura memoria se qualcuno ne avesse bisogno (cercando non ho trovato nulla)

  2. #2
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    954

    Re: SQL Server: errore in una vista - troppe tabelle

    Ciao una curiosità! Ma a che ti serve una vista del genere??????

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Solamente una riflessione ...

    In genere i "limiti" di un prodotto (importante come SQL Server ...) sono studiati molto bene.

    Il fatto che tu l'abbia superato (nel caso del numero di tabelle ...) mi fa sospettare che

    1) il tuo database non sia fatto in maniera ottimale

    2) la tua query possa essere sostituita con qualcosa di piu' funzionale (magari utilizzando tabelle temporanee intermedie ...)

    Confermo comunque che la mia e' solamente una riflessione ...

  4. #4
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    954
    Originariamente inviato da oregon
    Solamente una riflessione ...

    In genere i "limiti" di un prodotto (importante come SQL Server ...) sono studiati molto bene.

    Il fatto che tu l'abbia superato (nel caso del numero di tabelle ...) mi fa sospettare che

    1) il tuo database non sia fatto in maniera ottimale

    2) la tua query possa essere sostituita con qualcosa di piu' funzionale (magari utilizzando tabelle temporanee intermedie ...)

    Confermo comunque che la mia e' solamente una riflessione ...
    Concordo pienamente con te, io credo nella seconda opzione che hai messo, non ho mai visto una vista del genere con tante UNION!

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    338
    probabilmente avete perfettamente ragione, io sto affrontando un lavoro di aggiunta funzionalità ad una procedura già esistente e x ora mi limito a ricalcare l'esistente..

    cmq le UNION ci sono perchè preleviamo i dati da 20 db diversi, quindi..

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da Another
    probabilmente avete perfettamente ragione, io sto affrontando un lavoro di aggiunta funzionalità ad una procedura già esistente e x ora mi limito a ricalcare l'esistente..

    cmq le UNION ci sono perchè preleviamo i dati da 20 db diversi, quindi..
    Beh ... 20 db diversi per una sola applicazione sono gia' un'anomalia ...

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    338
    qui si tratta di 19 strutture diverse che interagiscono con quella centrale, che devo dire ci si rifa a scelte passate che avranno anche avuto senso, cmq io me lo devo pappare

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Pensa ad una azienda come una grande assicurazione che ha 10000 agenzie ... che fai? Usi 10000 db e una vista con n-mila tabelle?

    Sicuramente il problema delle scelte fatte in passato e' come dici tu ... ma tutti i nodi vengono al pettine prima o poi ...

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    338
    hai ragione, vedremo il da farsi..

  10. #10
    Mi sembra fuori luogo questo accanimento nei confronti di qualcosa che oltrettutto non si conosce bene.
    Se ci sono 20 db, ci sono 20 db, punto.
    E' probabile che quando è stato fatto c'erano altre necessità e altre possibilità (se non hai la possibilità di collegare in rete 10000 agenzie ti fai 10000 db e fino a pochi anni fa era una cosa possibilissima).
    Adesso sicuramente rifare tutto costa molto di più che modificare ogni tanto qualcosa.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.