2009-12-29 51 views
1

我想根據列名,類型等查詢一組表。我基本上不知道表的名稱,我想查詢數據庫中所有能夠存儲表的表數據進入。根據列信息查詢表名

我有這個查詢,但我不知道它是否非常有效。我想知道是否有更好的方法。

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 

此查詢當前有效,但我覺得必須有更好的方法。基本上我不希望其他表顯示可能有名稱爲Id的列而不是列Message和EnteredOn。

這是表的CREATE 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

願我們問爲什麼? – gbn 2009-12-29 20:43:26

+0

當然,但我認爲我回答了這個問題?我想向需要從此列表中選擇的接口提供可能的表的列表。基本上,我的界面需要獲得與特定模式匹配的表的列表,以確保正確的列可供使用。 – 2009-12-29 21:14:54

回答

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

出色的工作。我可能需要刷上我的SQL ... – 2009-12-29 21:15:40