2010-12-03 54 views
2

我正在使用SQL Server 2005,並以sa身份登錄。我想查詢我的數據庫中的每個表是否有一個特定的列名。如果是這樣,則將每行(columnNameValue = someValue)附加到結果表中。然後返回結果表。如果列名存在,請從數據庫中的每個表中選擇每行的每一行

這裏有一些與解決方案相似的問題。值得注意的是,我可以使用sp_MSForeachTable,但它缺少任何類型的文檔。我可以使用SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES來獲取所有表格的列表。

下面的解決方案(link text)將每列表&每列都在單元格中找到一定的值。這與在單元格中找到某個值(如果該列是某個columnName)不同。

編寫一個嵌套的while語句應該是可能的,但有沒有內置的命令來運行這樣的查詢?

僞代碼是否有幫助:

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

[編輯]

相反然後具有單個結果設定我想爲每表中的單個結果只要至少選擇返回一排。這應該會帶來很多不同的結果,因爲期待聯合或聯合工作是不現實的。

如果可能我想追加表名到每個結果的開頭。

下面我有一個簡單的查詢獲取所有的結果,但它會顯示爲空表和犯規給個別結果的任何視覺指示它屬於哪個表:

[更多編輯]

更新下面的查詢到包括是否存在檢查,消除NULL結果&選擇的名稱作爲源列表中添加源成績感謝向@馬丁

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

如果TableA有兩列而TableB有三列,你會發生什麼? – 2010-12-03 12:34:57

+0

@Lieven沒有必要將所有結果合併到一個表中,因爲它的可怕的不可讀性,因此爲每個已經說columnName有效的表返回一個結果集。 – Raynos 2010-12-03 13:17:05

回答

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 
相關問題