如何为此查询选择表名

时间:2017-05-04 15:17:18

标签: sql-server

我想从我的数据库中的所有表中选择电话号码以及这些表的名称。我写了一个查询,向我显示所有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'
 )

2 个答案:

答案 0 :(得分:2)

您可以简单地将表名作为常量添加到SELECT子句中。但是,我认为你将要运行这个查询,这意味着你还有一些事情需要改变:

  1. 您可能需要sp_executesql,这需要 Unicode 变量。因此,您需要DECLARE @SQL NVARCHAR(MAX)
  2. 您想要一个结果集还是多个结果集?我猜你想要在一个结果集中得到所有结果,这意味着你将要在查询的各个部分之间使用UNION ALL
  3. 所以,尝试这样的事情:

    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]时,只需使用一些您知道存在的表。如果你想要完全限定的表名,你还需要修改查询,但上面的内容应该让你开始。

答案 1 :(得分: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

我还添加了列TableNamephone_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)