none
Ricavare Tabella conoscendo il nome di un campo RRS feed

  • Domanda

  • Salve a tutti,

    Avrei bisogno di ricercare il nome di una tabella che non conosco in un DB SQL partendo dal nome di un campo 

    Grazie 1000

    Christian

    martedì 30 agosto 2016 08:45

Risposte

  • Buongiorno Chri972,

    puoi usare il seguente script, inserendo il nome del campo che ti serve

    SELECT sys.tables.name AS NomeTabella
    FROM sys.tables INNER JOIN sys.columns ON sys.tables.object_id = sys.columns.object_id
    WHERE sys.columns.name = 'NOME_CAMPO'

    In sostanza, mettiamo qui in relazione i nomi di colonna con le tabelle su cui si trovano. La select restituirà un elenco di nomi tabella su cui il campo che avrai indicato sarà stato riscontrato.

    Un saluto


    Emiliano Musso // Microsoft MVP .NET

    martedì 30 agosto 2016 09:24
  • Buongiorno Christian,

    ora mi è chiara la richiesta. Ti giro uno script da me redatto tempo addietro per un discorso simile. Fa uso di cursori, quindi non è il massimo della performance, ma è utile allo scopo

    DECLARE @TestoRicerca NVARCHAR(200)
    SET @TestoRicerca = 'TESTO DA RICERCARE'
    
    SET NOCOUNT ON
    DECLARE @tableName    SYSNAME
    DECLARE @tableColumn  SYSNAME
    DECLARE @sqlCommand   NVARCHAR(1000)
    
    DECLARE tCursor CURSOR FAST_FORWARD READ_ONLY FOR
                               SELECT sys.objects.name AS Tabella, 
                                      sys.columns.name AS Campo
                               FROM   sys.objects INNER JOIN sys.columns ON sys.objects.object_id = sys.columns.object_id 
                               WHERE  sys.objects.type = 'U' AND
                                      sys.columns.system_type_id IN (167, 175, 231, 239) AND 
                                      sys.columns.max_length >= LEN(@TestoRicerca)
                               ORDER BY sys.objects.name ASC,
                                        sys.columns.name ASC
    OPEN tCursor
    FETCH NEXT FROM tCursor INTO @tableName, @tableColumn
    
    PRINT 'Tabella | Campo' + CHAR(13) + CHAR(10) + '--------------------------------'
    WHILE (@@FETCH_STATUS = 0)
    BEGIN
       SET @sqlCommand = 'IF EXISTS (SELECT [' + @tableColumn + '] FROM ' + @tableName + ' WHERE [' + @tableColumn + '] LIKE ''%' + @TestoRicerca + '%'') PRINT ''' + @tableName +  ' | ' + @tableColumn + ''''
       EXECUTE (@sqlCommand)
       FETCH NEXT FROM tCursor INTO @tableName, @tableColumn
    END
    
    CLOSE tCursor
    DEALLOCATE tCursor
    SET NOCOUNT OFF
    

    Dovrai modificare il testo qui riportato come "TESTO DA RICERCARE", sostituendolo con la stringa per la quale vuoi effettuare la ricerca. Il funzionamento è semplice: lo script determina anzitutto quali sono le tabelle in cui può trovare campi testuali con lunghezze maggiori o uguali rispetto al tuo testo, e poi su ciascuna combinazione tabella/campo esegue una SELECT per determinare se questa restituisce almeno un record.

    I risultati vengono esposti nella tab "Messaggi": essi comprendono il nome di tabella ed il/i campo/i nei quali il testo in ingresso è stato trovato.

    Spero questo ti sia utile.

    Buon lavoro


    Emiliano Musso // Microsoft MVP .NET

    martedì 18 ottobre 2016 09:31

Tutte le risposte

  • Buongiorno Chri972,

    puoi usare il seguente script, inserendo il nome del campo che ti serve

    SELECT sys.tables.name AS NomeTabella
    FROM sys.tables INNER JOIN sys.columns ON sys.tables.object_id = sys.columns.object_id
    WHERE sys.columns.name = 'NOME_CAMPO'

    In sostanza, mettiamo qui in relazione i nomi di colonna con le tabelle su cui si trovano. La select restituirà un elenco di nomi tabella su cui il campo che avrai indicato sarà stato riscontrato.

    Un saluto


    Emiliano Musso // Microsoft MVP .NET

    martedì 30 agosto 2016 09:24
  • Ciao Emiliano,

    In alcuni casi e' davvero utile grazie 1000

    Christian 

    martedì 30 agosto 2016 15:18
  • Ciao

    Visto l'utilità della query di Emiliano vorrei chiedervi anche se partendo da un campo conoscere tutte le tabelle in cui esso e' contenuto.

    Saluti, Christian
    martedì 20 settembre 2016 15:09
  • Buonasera Chri972,

    la query che ho proposto fa precisamente quello: dato il nome di un campo, da indicare al posto della stringa NOME_CAMPO, essa restituisce per ciascuna riga di risultato una delle tabelle su cui si trova tale campo.

    L'intero recordset dei risultati rappresenta la totalità delle tabelle che presentano il campo indicato nella clausola WHERE della query.


    Emiliano Musso // Microsoft MVP .NET

    martedì 20 settembre 2016 15:14
  • Ciao Emiliano,

    Scusate se insito sull'argomento, ma ultimamente sto facendo spesso questo tipo di attività' di ricerca sui DB ed una cosa che mi sono reso conto che e' molto utile conoscere partendo da un Valore ad esempio il mio nome Christian, conoscere i campi e le tabelle in essi contenuti.Questo Lo chiedo perché' partendo dalla visualizzazione del valore ad esempio sul sito del DB, poi mi serve capire quel valore come si e' propagato nelle tabelle e capire il campo che nome abbia. lo chiedo perche' non sempre l'associazione del valore non e'  uguale ai campi del DB cioe' christian=nome. Spero di essere stato chiaro

    Grazie 1000

    Christian 

    martedì 18 ottobre 2016 07:58
  • Buongiorno Christian,

    ora mi è chiara la richiesta. Ti giro uno script da me redatto tempo addietro per un discorso simile. Fa uso di cursori, quindi non è il massimo della performance, ma è utile allo scopo

    DECLARE @TestoRicerca NVARCHAR(200)
    SET @TestoRicerca = 'TESTO DA RICERCARE'
    
    SET NOCOUNT ON
    DECLARE @tableName    SYSNAME
    DECLARE @tableColumn  SYSNAME
    DECLARE @sqlCommand   NVARCHAR(1000)
    
    DECLARE tCursor CURSOR FAST_FORWARD READ_ONLY FOR
                               SELECT sys.objects.name AS Tabella, 
                                      sys.columns.name AS Campo
                               FROM   sys.objects INNER JOIN sys.columns ON sys.objects.object_id = sys.columns.object_id 
                               WHERE  sys.objects.type = 'U' AND
                                      sys.columns.system_type_id IN (167, 175, 231, 239) AND 
                                      sys.columns.max_length >= LEN(@TestoRicerca)
                               ORDER BY sys.objects.name ASC,
                                        sys.columns.name ASC
    OPEN tCursor
    FETCH NEXT FROM tCursor INTO @tableName, @tableColumn
    
    PRINT 'Tabella | Campo' + CHAR(13) + CHAR(10) + '--------------------------------'
    WHILE (@@FETCH_STATUS = 0)
    BEGIN
       SET @sqlCommand = 'IF EXISTS (SELECT [' + @tableColumn + '] FROM ' + @tableName + ' WHERE [' + @tableColumn + '] LIKE ''%' + @TestoRicerca + '%'') PRINT ''' + @tableName +  ' | ' + @tableColumn + ''''
       EXECUTE (@sqlCommand)
       FETCH NEXT FROM tCursor INTO @tableName, @tableColumn
    END
    
    CLOSE tCursor
    DEALLOCATE tCursor
    SET NOCOUNT OFF
    

    Dovrai modificare il testo qui riportato come "TESTO DA RICERCARE", sostituendolo con la stringa per la quale vuoi effettuare la ricerca. Il funzionamento è semplice: lo script determina anzitutto quali sono le tabelle in cui può trovare campi testuali con lunghezze maggiori o uguali rispetto al tuo testo, e poi su ciascuna combinazione tabella/campo esegue una SELECT per determinare se questa restituisce almeno un record.

    I risultati vengono esposti nella tab "Messaggi": essi comprendono il nome di tabella ed il/i campo/i nei quali il testo in ingresso è stato trovato.

    Spero questo ti sia utile.

    Buon lavoro


    Emiliano Musso // Microsoft MVP .NET

    martedì 18 ottobre 2016 09:31
  • WOW Grazie 1000 la provo subito

    Christian

    martedì 18 ottobre 2016 10:09