我想从我的数据库中的所有表中选择电话号码以及这些表的名称。我写了一个查询,向我显示所有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'
)
答案 0 :(得分:2)
您可以简单地将表名作为常量添加到SELECT
子句中。但是,我认为你将要运行这个查询,这意味着你还有一些事情需要改变:
sp_executesql
,这需要 Unicode 变量。因此,您需要DECLARE @SQL NVARCHAR(MAX)
。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]
时,只需使用一些您知道存在的表。如果你想要完全限定的表名,你还需要修改查询,但上面的内容应该让你开始。
答案 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
我还添加了列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)