2016-11-08 2 views
-2

Ich möchte einen bestimmten Wert in meiner Datenbank suchen, den ich nicht weiß, wo es genau ist. Gibt es eine Abfrage, die den Spaltennamen oder den Tabellennamen eines bestimmten Werts im SQL Server zurückgegeben hat? Angenommen, ich habe den Wert einer Spalte wie 123, aber ich weiß nicht, dass 123 zu welcher Tabelle gehört und ich weiß nichts über den Spaltennamen. Kann ich eine Abfrage schreiben, um Tabellennamen zu finden, in denen dieser Wert enthalten ist? Ich brauche eine Abfrage, keine Prozedur !!!finde Spaltenname oder Tabellenname eines bestimmten Wertes

+0

Wenn dies eine von Ihnen entworfene Datenbank ist, ist dies wahrscheinlich ein Zeichen für ein fehlerhaftes Datenmodell. Werte des gleichen "Typs", so dass die Werte vergleichbar oder berechenbar sind * sollte * in einer Spalte einer Tabelle gespeichert werden. Wenn sie über mehrere Spalten/Tabellen hinweg gespeichert werden, werden Werte, die eigentlich Daten sein sollten, stattdessen als Metadaten in das Modell eingebettet, z. B. Spalten- oder Tabellennamen. –

Antwort

0

Dies könnte es für Sie tun. Beachten Sie, dass dies bei einer großen Anzahl von Tabellen/Spalten eine ganze Weile dauern kann. Wenn Sie nicht in (N)VARCHAR Spalten suchen, möchten Sie diese Typen möglicherweise zur c.DATA_TYPE NOT IN(...-Klausel hinzufügen. Oder einen anderen Typ, in den Sie nicht hineinschauen (wie FLOAT oder 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

Hinweis: Es kann besser sein, die gesuchten Typen einzuschränken, indem Sie 'c.DATA_TYPE IN (...' anstatt 'c.DATA_TYPE NOT IN (...') eingeben, wenn Sie wissen, welche Datentypen Sie suchen im. –

Verwandte Themen