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
Qu'attendez-vous de ce que TableA a deux colonnes et TableB a trois? –
@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