在SQL Server 2016 Management Studio中,我有多个数据库。
我想找出哪些数据库中哪些数据库有一个名称中包含字符串的列。我怎么能这样做?
是否可以在对象资源管理器窗口中进行搜索?
答案 0 :(得分:2)
您需要在服务器上迭代数据库,
SELECT name FROM master.dbo.sysdatabases
使用
为每个命令执行以下命令select table_name,COLUMN_NAME
from INFORMATION_SCHEMA.columns
where COLUMN_NAME like '% XXX %'
使用光标
CREATE TABLE #tmpList (DatabaseName varchar(64),TableName varchar(64))
DECLARE @DbName varchar(64)
DECLARE @sql nvarchar(max)
DECLARE @ColCursor CURSOR
SET @colCursor = CURSOR FOR
SELECT [name] FROM master.dbo.sysdatabases
OPEN @ColCursor
FETCH NEXT FROM @ColCursor INTO @DBName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'INSERT INTO #tmpList '+
'SELECT '''+@DbName+''',table_Name FROM '+@dbName+'.INFORMATION_SCHEMA.columns where COLUMN_NAME like ''% XXX %'' '
EXEC(@sql)
FETCH NEXT FROM @ColCursor INTO @DBName
END
CLOSE @ColCursor;
select * from #tmpList
drop table #tmpList
答案 1 :(得分:2)
您可以使用sp_MSForeeachdb
此方法将为您服务器上的每个数据库收集 INFORMATION_SCHEMA.COLUMNS
Select * Into #TempFields From INFORMATION_SCHEMA.COLUMNS where 1=0
Declare @SQL varchar(max)=';Use [?]; Insert Into #TempFields Select * From INFORMATION_SCHEMA.COLUMNS '
Execute master.sys.sp_MSforeachdb @SQL
Select * from #TempFields
Where Column_Name Like '%XYZ%'
编辑 - 请求评论
第一个查询创建一个EMPTY结构来保存Information_Schema
然后我们DECLARE @SQL包含我们想要为每个数据库执行的SQL。请注意;使用[?];
然后我们只需选择#Temp表以获得所需的结果
答案 2 :(得分:1)
在每个数据库上运行以下命令,或使用cursor
和dynamic sql
迭代每个数据库
select A.name,B.name From sys.objects as A
inner join sys.all_columns as B
on B.object_id = A.object_id
where A.type = 'U' and B.name = ...
<强>更新强>
对于模糊查找,使用B.name like '%serarch_pttern%
,%
表示任何前导或尾随字符