2010-12-03 8 views
2

Ich verwende SQL Server 2005 und bin als sa angemeldet. Ich möchte jede Tabelle in meiner Datenbank abfragen, ob sie einen bestimmten Spaltennamen hat. Und wenn dies der Fall ist, fügen Sie jede Zeile wo (columnNameValue = someValue) an eine Ergebnistabelle an. Dann gebe die Ergebnistabelle zurück.Wählen Sie jede Zeile aus jeder Tabelle in der Datenbank aus, wobei (columnName = Wert), wenn der Spaltenname existiert

Es gibt ein paar ähnliche Probleme mit Lösungen da draußen. Insbesondere kann ich dafür sp_MSForeachTable verwenden, aber es fehlt jede Art von Dokumentation. Ich kann SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES verwenden, um eine Liste aller Tabellen zu erhalten.

Die folgende Lösung (link text) wird jede Tabelle & jede Spalte gehen, um einen bestimmten Wert in der Zelle zu finden. Was unterscheidet sich von der Suche nach einem bestimmten Wert in der Zelle, wenn diese Spalte ein bestimmter columnName ist.

Schreiben einer geschachtelten while-Anweisung sollte möglich sein, aber gibt es irgendwelche eingebauten Befehle, um solche Abfragen auszuführen?

Pseudo-Code, wenn es hilft:

foreach(table in tableList) { 
    if (table.hasColumnName(SOME_COLUMN) { 
     EXEC ('SELECT * FROM table WHERE (SOME_COLUMN = SOME_VALUE)') 
    } 
} 

[Bearbeiten]

Vielmehr dann eine einzelne Ergebnisse gesetzt haben, möchte ich ein einzelnes Ergebnis pro Tisch sein, solange die Auswahl kehrt zumindest eine Reihe. Dies sollte zu einer sehr großen Anzahl unterschiedlicher Ergebnisse führen, da es unrealistisch ist, einen Beitritt oder eine Gewerkschaft zu erwarten.

Wenn möglich, möchte ich den Tabellennamen am Anfang jedes Ergebnisses anfügen.

Ich habe eine einfache Abfrage unter dem alle Ergebnisse bekommt, aber es wird leer Tabellen angezeigt werden und jede visuelle Anzeige in einzelnen Ergebnisse geben tut als zu welchem ​​Tisch sie gehört:

[Weitere Bearbeiten]

aktualisiert die unter Abfrage der IF enthalten EXIST prüfen, ob entfernt NULL Ergebnisse & die select name AS Quellspalte der Tabelle Quelle an die Ergebnisse dank hinzufügen @ Martin

DECLARE @COLUMN_VALUE nvarchar(512), @VALUE nvarchar(10); 

SET @COLUMN_VALUE = 'id' 
SET @VALUE = '0'; 

DECLARE @TABLE_NAME nvarchar(512), @COLUMN_NAME nvarchar(512), @QUERY nvarchar(512); 

SET @TABLE_NAME = ''; 

WHILE @TABLE_NAME IS NOT NULL 
BEGIN 
    SET @TABLE_NAME = 
    (
     SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)) 
     FROM INFORMATION_SCHEMA.TABLES 
     WHERE QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TABLE_NAME 
    ); 
    PRINT 'Table name : ' + @TABLE_NAME; 
    SET @COLUMN_NAME = 
    (
     SELECT MIN(QUOTENAME(COLUMN_NAME)) 
     FROM INFORMATION_SCHEMA.COLUMNS 
     WHERE (TABLE_NAME = PARSENAME(@TABLE_NAME, 1)) 
      AND (COLUMN_NAME = @COLUMN_VALUE) 

    ); 
    PRINT 'Column name : ' + @COLUMN_NAME; 
    IF @COLUMN_NAME IS NOT NULL 
    BEGIN 
     SET @QUERY = 
      'SELECT ''' + @TABLE_NAME + ''' AS Source, * ' + 
      'FROM ' + @TABLE_NAME + ' ' + 
      'WHERE (' + @COLUMN_NAME + ' = ' + @VALUE + ')' 
     EXEC 
     (
      'IF EXISTS(' + @QUERY + ') ' + @QUERY 
     ) 
    END  
END 
+0

Was erwarten Sie, wenn TableA zwei Spalten und TableB drei Spalten hat? –

+0

@Lieven Es müssen nicht alle Ergebnisse in einer Tabelle zusammengeführt werden, da sie fürchterlich unlesbar sind. Daher ist die Rückgabe einer einzelnen Ergebnismenge für jede Tabelle mit besagtem Spaltennamen zulässig. – Raynos

Antwort

7
CREATE TABLE foo 
(
SOME_COLUMN VARCHAR(10) 
) 

CREATE TABLE bar 
(
SOME_COLUMN VARCHAR(10) 
) 

INSERT INTO bar VALUES ('SOME_VALUE') 


DECLARE @Query nvarchar(max) 

SELECT 
     @Query = isnull(@Query + ';','') + 
     'IF EXISTS(SELECT * FROM ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + 
     QUOTENAME(o.name) + ' WHERE SOME_COLUMN=''SOME_VALUE'') 
     SELECT ''' + o.name +''' AS Source, * FROM ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + 
     QUOTENAME(o.name) + ' WHERE SOME_COLUMN=''SOME_VALUE''' 
FROM sys.columns c 
JOIN sys.objects o 
ON o.object_id = c.object_id 
WHERE o.type IN ('U','V') AND c.name = 'SOME_COLUMN' 

EXEC sp_executesql @Query 
+0

Können Sie klären, was 'schema_id' und' object_id' sein sollten? Ich erkannte, dass es unnötig ist, nach dem Ergebnis zu fragen, dass es sich um einen großen JOIN mit vielen Spalten handelt. – Raynos

+0

Nicht sicher, was du meinst? Das sind Spalten in 'sys.tables' –

+0

Es wirft den http://www.sql-server-performance.com/faq/all_queries_must_have_an_equal_number_of_expressions_p1.aspx Fehler für mich auf. Ich vergesse zu erwähnen, dass es keine Garantie gibt, dass alle Tabellen den Namen der Spalte in ihnen haben werden. – Raynos

Verwandte Themen