Principale utente con più risposte
Ricavare Tabella conoscendo il nome di un campo

Domanda
-
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
- Proposto come risposta Paolo Pranzo martedì 30 agosto 2016 15:27
- Contrassegnato come risposta Alessandro AlpiMVP, Moderator giovedì 1 settembre 2016 10:48
-
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
- Contrassegnato come risposta Edoardo BenussiMVP, Moderator mercoledì 19 ottobre 2016 09:11
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
- Proposto come risposta Paolo Pranzo martedì 30 agosto 2016 15:27
- Contrassegnato come risposta Alessandro AlpiMVP, Moderator giovedì 1 settembre 2016 10:48
-
Ciao Emiliano,
In alcuni casi e' davvero utile grazie 1000
Christian
- Contrassegnato come risposta Chri972 martedì 20 settembre 2016 14:43
- Contrassegno come risposta annullato Edoardo BenussiMVP, Moderator mercoledì 21 settembre 2016 17:35
-
-
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
-
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
-
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
- Contrassegnato come risposta Edoardo BenussiMVP, Moderator mercoledì 19 ottobre 2016 09:11
-