浏览服务器中的所有数据库以获取特定数据

时间:2018-10-09 10:03:22

标签: sql sql-server tsql

是否可以编写遍历服务器上每个数据库对象并获取我需要的特定数据的脚本?就像是-每个包含地址或电子邮件的对象

编辑:我基本上需要找到包含客户端信息的数据库对象。如何找到所有包含“ @”的对象(如电子邮件中的内容)?

2 个答案:

答案 0 :(得分:0)

您可以使用SQL sp_MSForEachTable过程作为选项 在参考文档中,有一个SQL脚本可以返回所有数据库表及其列(仅作为示例)

也可以使用sp_MSForEachDB在同一SQL Server实例上的所有数据库上执行相同的脚本

但是,如果您要查找名称如地址或电子邮件的数据库表列,则还可以使用以下SQL Select语句

select 
    object_name(c.object_id) [object name], 
    o.type_desc [object type],
    c.name [column name] 
from sys.columns as c
inner join sys.objects as o
    on c.object_id = o.object_id
where c.name like '%address%' or c.name like '%email%'

答案 1 :(得分:0)

您可以尝试以下方法:

CREATE TABLE #tbl(TableName VARCHAR(255),ColumnName VARCHAR(255))
DECLARE @SearchFor VARCHAR(100)='@'

-在此处使用不同的片段,您可以使用“街道”或“道路”或其他任何内容

DECLARE @stmt VARCHAR(MAX);
DECLARE cur CURSOR FOR
SELECT
'INSERT INTO #tbl(TableName,ColumnName)
 SELECT ''' + CONCAT(c.TABLE_SCHEMA,'.',c.TABLE_NAME) + ''',''' + c.COLUMN_NAME + '''
 WHERE EXISTS(SELECT 1 FROM ' + CONCAT(QUOTENAME(c.TABLE_SCHEMA),'.',QUOTENAME(c.TABLE_NAME)) + ' WHERE ' + QUOTENAME(c.COLUMN_NAME) +' LIKE ''%' + @SearchFor +'%'');'
FROM INFORMATION_SCHEMA.COLUMNS c
WHERE c.DATA_TYPE LIKE '%char%';

OPEN cur;

FETCH NEXT FROM cur INTO @stmt;
EXEC(@stmt);
WHILE @@FETCH_STATUS=0
BEGIN
    FETCH NEXT FROM cur INTO @stmt;
    EXEC(@stmt);
END
CLOSE cur;
DEALLOCATE cur;

SELECT * FROM #tbl;
GO
DROP TABLE #tbl;

需要CURSOR的罕见情况之一。
游标将包含许多根据INFORMATION_SCHEMA.COLUMNS构建的语句。如果至少有一行包含搜索值,则将表和列名添加到结果表中。

每个语句看起来都与此类似:

INSERT INTO #tbl(TableName,ColumnName)
 SELECT 'dbo.SomeTable','SomeColumn'
 WHERE EXISTS(SELECT 1 FROM [dbo].[SomeTable] WHERE [SomeColumn] LIKE '%@%');