2010-12-03 4 views
2

J'utilise SQL Server 2005 et suis connecté en tant que sa. Je voudrais interroger chaque table dans ma base de données pour savoir si elle a un certain nom de colonne. Et si oui, ajoutez chaque ligne où (columnNameValue = someValue) à une table de résultats. Puis retournez la table des résultats.Sélectionnez chaque ligne de chaque table dans la base de données où (nomColonne = valeur) si le nom de colonne existe

Il existe quelques problèmes similaires avec des solutions. Notamment, je peux utiliser sp_MSForeachTable pour cela, mais il manque de toute sorte de documentation. Je peux utiliser SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES pour obtenir une liste de toutes les tables.

La solution suivante (link text) ira à chaque table & chaque colonne pour trouver une certaine valeur dans la cellule. Ce qui est différent de trouver une certaine valeur dans la cellule SI cette colonne est un certain nom de colonne.

Écrire une instruction while imbriquée devrait être possible, mais existe-t-il des commandes intégrées pour exécuter des requêtes comme celle-ci?

pseudo-code si elle aide:

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

[Modifier]

Plutôt que d'avoir un seul résultat je plaçai voudrais être un seul résultat par table tant que le retour de sélection au moins une rangée. Cela devrait donner une très grande quantité de résultats différents car attendre une jointure ou une union pour travailler est irréaliste.

Si possible, je voudrais ajouter le nom de table au début de chaque résultat.

J'ai une simple requête ci-dessous qui obtient tous les résultats, mais il affiche des tables vides et ne marche pas donner une indication visuelle dans les résultats individuels à quelle table il appartient:

[plus Modifier]

Mise à jour la requête ci-dessous pour inclure le if exist vérifier que les résultats NULL supprime & le nom de sélection AS colonne source pour ajouter la source de table aux résultats grâce à @ 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

Qu'attendez-vous de ce que TableA a deux colonnes et TableB a trois? –

+0

@Lieven Il n'est pas nécessaire que tous les résultats soient fusionnés dans une table car il est horriblement illisible, ce qui fait que retourner un seul ensemble de résultats pour chaque table qui a ce nom de colonne est valide. – Raynos

Répondre

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

Pourriez-vous clarifier ce que 'schema_id' et' object_id' devraient être? Je me suis rendu compte que demander que les résultats soient définis comme un grand JOIN avec beaucoup de colonnes est inutile. – Raynos

+0

Vous ne savez pas ce que vous voulez dire? Ce sont des colonnes dans 'sys.tables' –

+0

Il déclenche l'erreur http://www.sql-server-performance.com/faq/all_queries_must_have_an_equal_number_of_expressions_p1.aspx pour moi. J'oublie de mentionner qu'il n'y a pas de garantie que toutes les tables auront le nom de colonne en eux. – Raynos

Questions connexes