2017-05-04 55 views
0

我想從我的數據庫中的所有表中選擇電話號碼以及這些表的名稱。我寫了一個查詢,顯示所有phone_numbers,但我不知道如何爲每個電話號碼選擇表名稱。這是我的查詢:如何爲此查詢選擇表名

DECLARE @SQL AS VarChar(MAX) 
SET @SQL = '' 

SELECT @SQL = @SQL + 'SELECT phone_number FROM ' + TABLE_SCHEMA + '.[' + TABLE_NAME + ']' + CHAR(13) 
FROM INFORMATION_SCHEMA.TABLES where table_name in (select table_name 
from information_schema.columns 
where column_name = 'phone_number' 
) 
+1

如果每個表有一個名爲列這隻會工作'PHONE_NUMBER ' – logixologist

+0

您打算在報告或程序中使用此查詢嗎?因爲如果沒有,只需使用[SQL SEARCH](http://www.red-gate.com/dynamic/products/sql-development/sql-search/download)並在選擇「搜索表」選項時搜索「phone_number」只要。這個工具是免費的並且集成到SMSS中。 – AXMIM

+0

@AXMIM看起來他似乎試圖讓所有電話號碼在整個數據庫中,而不管表格。 SQL Search只會告訴你他們在 – logixologist

回答

0

另一個解決方案沒有CURSOR。你可以像這樣將每個查詢與UNION結合起來。

--SELECT DISTINCT phone_number FROM dbo.Course c 

DECLARE @sql nvarchar(max) = '' 

SELECT @sql = @sql + N' SELECT DISTINCT phone_number, '''+ s.name + '.' + t.name + ''' AS TableName 
         FROM '+ s.name + '.' + t.name + Char(13) + ' UNION' + char(13) 
FROM sys.tables t 
INNER JOIN sys.schemas s ON t.schema_id = s.schema_id 
INNER JOIN sys.columns c ON c.object_id = t.object_id 
WHERE c.name ='phone_number' 

IF(@sql != '') 
BEGIN 
    SET @sql = LEFT(@sql,len(@sql) - 6) -- remove last UNION 

    PRINT @sql 

    -- execute sql 
    EXEC sp_executesql @sql 
END 

我還加列TableName:中phone_number

表如果你想TableName如果第一列然後改變它

SELECT @sql = @sql + N' SELECT DISTINCT '''+ s.name + '.' + t.name + ''' AS TableName, phone_number 
        FROM '+ s.name + '.' + t.name + Char(13) + ' UNION' + char(13) 
+0

它正在工作,但我有一個問題。我需要更改列的順序。我想TableName是第一個。 – adamek339

+0

然後在串聯@sql字符串時更改順序:TableName後的phone_number – TriV

+0

我嘗試這樣的事情,但它不起作用。 – adamek339

2

你可以簡單地爲常數添加表的名稱爲SELECT條款。但是,我相信你會想運行此查詢,這意味着你有一些事情改變:

  1. 你可能會想sp_executesql,這需要一個的Unicode變量。所以,你需要DECLARE @SQL NVARCHAR(MAX)
  2. 你想要一個結果集還是多個結果集?我猜你想在一個結果集中得到所有結果,這意味着你將要在查詢的各個部分之間使用UNION ALL

因此,嘗試這樣的事情:

DECLARE @sql NVARCHAR(MAX) 
SET @sql = N'SELECT '''' AS table_name, '''' AS phone_number FROM [dbo].[SomeTable] WHERE 1 = 0' 

DECLARE @table_name SYSNAME 
DECLARE cur CURSOR LOCAL FAST_FORWARD FOR 
SELECT table_name 
FROM INFORMATION_SCHEMA.columns 
WHERE column_name = 'phone_number' 

OPEN cur 

FETCH NEXT FROM cur INTO @table_name 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @sql = @sql + N' UNION ALL SELECT ''' + @table_name + N''', phone_number FROM [' + @table_name + N']' 
    FETCH NEXT FROM cur INTO @table_name 
END 

CLOSE cur 
DEALLOCATE cur 

EXEC sp_executesql @sql 

當我用[dbo].[SomeTable],只是使用一些表格,你知道存在。如果您需要完全限定的表名稱,您還需要修改查詢,但上面的內容會幫助您開始。