我正在尝试编写一个查询,对于单个SQL Server实例,列出服务器实例上所有数据库中所有表中的所有列。我找到了列出所有表中所有列的示例,但您必须知道数据库名称。我找到了在SQL Server实例上列出数据库但不在数据库中列出表的示例。现在我试图找到两者结合的东西,但我没有太多运气。
是否有人知道这样的事情是否存在或是否是弥补差距的手动过程?
谢谢,
汤姆
答案 0 :(得分:0)
您可以使用动态查询。我没有找到任何其他方式。
declare @str varchar(max) = ''
;with dbs as (
select *
from sys.databases
where dbs.name not in ('master', 'tempdb', 'model', 'msdb')
)
select @str = @str + 'select ''' + dbs.name + ''', tbl.name, col.name from ' +
dbs.name + '.sys.tables tbl inner join ' +
dbs.name + '.sys.columns col ON col.object_id = tbl.object_id; '
from dbs
print @str
exec(@str)
答案 1 :(得分:0)
请尝试此操作并反馈评论。
要求是从所有数据库中找出一个特定的表。目视检查无法做到这一点,因为它可能需要很长时间才能实现人为错误。她知道系统视图sys.tables。
SELECT *
FROM sys.Tables
WHERE name LIKE '%Address%'
上面提到的查询限制是它只搜索一个数据库,用户必须继续手动更改数据库并再次运行查询。我写下了快速脚本,它查看了服务器上的所有数据库,并提供了名称中包含搜索词的数据库名称,模式名称和表格。
CREATE PROCEDURE usp_FindTableNameInAllDatabase
@TableName VARCHAR(256)
AS
DECLARE @DBName VARCHAR(256)
DECLARE @varSQL VARCHAR(512)
DECLARE @getDBName CURSOR
SET @getDBName = CURSOR FOR
SELECT name
FROM sys.databases
CREATE TABLE #TmpTable (DBName VARCHAR(256),
SchemaName VARCHAR(256),
TableName VARCHAR(256))
OPEN @getDBName
FETCH NEXT
FROM @getDBName INTO @DBName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @varSQL = 'USE ' + @DBName + ';
INSERT INTO #TmpTable
SELECT '''+ @DBName + ''' AS DBName,
SCHEMA_NAME(schema_id) AS SchemaName,
name AS TableName
FROM sys.tables
WHERE name LIKE ''%' + @TableName + '%'''
EXEC (@varSQL)
FETCH NEXT
FROM @getDBName INTO @DBName
END
CLOSE @getDBName
DEALLOCATE @getDBName
SELECT *
FROM #TmpTable
DROP TABLE #TmpTable
GO
EXEC usp_FindTableNameInAllDatabase 'Address'
GO