2016-11-08 8 views
-2

Je veux rechercher une valeur spécifique dans ma base de données que je ne sais pas où est-ce exactement. Existe-t-il une requête qui a renvoyé le nom de colonne ou le nom de table d'une valeur spécifique dans le serveur SQL? Supposons que j'ai une valeur d'une colonne comme 123, mais je ne sais pas 123 appartient à quelle table et je ne sais pas sur son nom de colonne. Puis-je écrire une requête pour trouver les noms de table que cette valeur est dedans? J'ai besoin d'une requête pas une procédure !!!trouver le nom de la colonne ou le nom de la table d'une valeur spécifique

+0

S'il s'agit d'une base de données que vous avez conçue, il s'agit probablement d'un modèle de données brisé. Des valeurs du même "type", telles que les valeurs sont comparables ou calculables * doivent * être stockées dans une colonne d'une table. Si elles sont stockées sur plusieurs colonnes/tables, il est probable que les valeurs qui doivent être des données soient incorporées dans le modèle en tant que métadonnées, telles que les noms de colonne ou de table. –

Répondre

0

Cela pourrait le faire pour vous. Notez que si vous avez beaucoup de tables/colonnes cela peut prendre beaucoup de temps. Si vous ne recherchez pas dans les colonnes (N)VARCHAR, vous pouvez ajouter ces types à la clause c.DATA_TYPE NOT IN(.... Ou tout autre type que vous ne cherchez pas (comme FLOAT ou DECIMAL).

SET NOCOUNT ON; 
DECLARE @value NVARCHAR(MAX)='123'; 
CREATE TABLE #found(table_name SYSNAME,column_name SYSNAME); 
DECLARE @sql NVARCHAR(MAX)=(
    SELECT 
     'INSERT INTO #found(table_name,column_name) ' + 
     'SELECT TOP 1 '+ 
      'table_name='''+REPLACE(t.TABLE_NAME,'''','''''')+''','+ 
      'column_name='''+REPLACE(c.COLUMN_NAME,'''','''''')+''' '+ 
     'FROM '+ 
      QUOTENAME(t.TABLE_SCHEMA)+'.'+QUOTENAME(t.TABLE_NAME)+' '+ 
     'WHERE '+ 
      QUOTENAME(c.COLUMN_NAME)+'='''+REPLACE(@value,'''','''''')+''';' 
    FROM 
     INFORMATION_SCHEMA.TABLES AS t 
     INNER JOIN INFORMATION_SCHEMA.COLUMNS AS c ON 
      c.TABLE_SCHEMA=t.TABLE_SCHEMA AND 
      c.TABLE_NAME=t.TABLE_NAME 
    WHERE 
     t.TABLE_TYPE='BASE TABLE' AND 
     c.DATA_TYPE NOT IN('BIT','NTEXT','TEXT','IMAGE','BINARY','VARBINARY','DATETIME','DATE','DATETIME2','TIME','SMALLDATETIME','DATETIMEOFFSET') 
    FOR XML 
     PATH('') 
); 

EXECUTE (@sql); 
SELECT * FROM #found ORDER BY table_name,column_name; 
DROP TABLE #found; 
+0

Note: Il peut être préférable de restreindre les types que vous recherchez en écrivant 'c.DATA_TYPE IN (...' plutôt que 'c.DATA_TYPE NOT IN (...', si vous connaissez les types de données que vous cherchez dans. –