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
Was erwarten Sie, wenn TableA zwei Spalten und TableB drei Spalten hat? –
@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