2009-12-29 9 views
1

Je veux interroger un ensemble de tables en fonction du nom de colonne, type, etc. Fondamentalement sans connaître le nom d'une table que je veux interroger la base de données pour toutes les tables capables de stocker les données dans.noms de table requête basée sur les informations de colonne

J'ai cette requête, mais je ne suis pas sûr que ce soit très efficace. Je me demandais s'il y avait un meilleur moyen.

SELECT O.TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS AS O 
    INNER JOIN INFORMATION_SCHEMA.COLUMNS AS R1 
     ON R1.TABLE_NAME = O.TABLE_NAME and R1.COLUMN_NAME = 'Id' and R1.DATA_TYPE = 'uniqueidentifier' 
    INNER JOIN INFORMATION_SCHEMA.COLUMNS as R2 
     ON R2.TABLE_NAME = O.TABLE_NAME and R2.COLUMN_NAME = 'Message' and R2.DATA_TYPE = 'nvarchar' 
    INNER JOIN INFORMATION_SCHEMA.COLUMNS AS R3 
     ON R3.TABLE_NAME = O.TABLE_NAME and R3.COLUMN_NAME = 'EnteredOn' and R3.DATA_TYPE = 'datetime' 
    GROUP BY O.TABLE_NAME 

Cette requête travaille actuellement mais je pense qu'il doit y avoir une meilleure façon. Fondamentalement, je ne veux pas d'autres tableaux montrant qui peuvent avoir une colonne avec le nom Id mais pas les colonnes message et EnteredOn.

Voici la requête CREATE TABLE pour la table.

CREATE TABLE [dbo].[Log](
    [Id] [uniqueidentifier] ROWGUIDCOL NOT NULL, 
    [Message] [nvarchar](2048) NULL, 
    [EnteredOn] [datetime] NOT NULL, 
CONSTRAINT [PK_Log] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
+0

Pouvons-nous demander pourquoi? – gbn

+0

Bien sûr, mais je pensais que j'ai répondu? Je souhaite fournir une liste de tables possibles à une interface devant être sélectionnée dans cette liste. Fondamentalement, mon interface a besoin d'obtenir une liste des tables qui correspondent au schéma spécifique pour assurer les colonnes appropriées sont disponibles. –

Répondre

4
SELECT table_schema, table_name 
FROM information_schema.columns 
WHERE COLUMN_NAME = 'Id'  AND DATA_TYPE = 'uniqueidentifier' 
OR  COLUMN_NAME = 'Message' AND DATA_TYPE = 'nvarchar' 
OR  COLUMN_NAME = 'EnteredOn' AND DATA_TYPE = 'datetime' 
GROUP BY table_schema, table_name 
HAVING COUNT(COLUMN_NAME) = 3 
+1

Excellent travail. Je pourrais avoir besoin de rafraîchir mon SQL ... –

Questions connexes