循环访问数据库和每个表以查找包含电话号码的任何列

时间:2013-02-06 15:39:30

标签: sql sql-server-2008

我需要循环遍历每个数据库表和每列,看它是否包含电话号码。 任何以文本+或00或0开头的内容。

我找到了遍历列名的代码/游标,但它们不搜索实际数据。 我有什么想法可以做到这一点吗?

2 个答案:

答案 0 :(得分:1)

您需要将这些游标与查询结合使用才能找到您想要的内容。

这是一个搜索所有表的所有列的脚本。我将留给您添加搜索所有数据库

(假设您使用的是SQL Server 2005或更新版本。它可能适用于其他系统但未经测试。

--fields types to search within
declare table_field_cursor cursor local fast_forward for select sys.tables.name, sys.columns.name from sys.columns inner join sys.tables on (sys.columns.object_id = sys.tables.object_id)inner join sys.types on (sys.columns.system_type_id = sys.types.system_type_id)
where sys.tables.type = 'U' and sys.types.name in ('varchar', 'nvarchar', 'char', 'nchar', 'text')

--Stop printing the Rows affected message.
set NOCOUNT ON

--loop through all tables & fields seaching for your string
open table_field_cursor

declare @table_name sysname
declare @field_name sysname

fetch next from table_field_cursor into @table_name, @field_name
while @@fetch_status <> -1
begin
    if @@FETCH_STATUS <> -2
        execute ('
        if EXISTS(select [' + @field_name + '] from [' + @table_name + '] with (nolock) where cast([' + @field_name + '] as nvarchar(3)) like ''+%'' or cast([' + @field_name + '] as nvarchar(3)) like ''0%'')
        begin
        print ''Found in table ' + @table_name + '.' + @field_name + '!''
        select * from [' + @table_name + ']  with (nolock) where cast([' + @field_name + '] as nvarchar(3)) like ''+%'' or cast([' + @field_name + '] as nvarchar(3)) like ''0%''
        end
        ')

    fetch next from table_field_cursor into @table_name, @field_name
end 

close table_field_cursor
deallocate table_field_cursor

这将搜索包含varcharnvarcharcharnchartext列的所有表,并查看它是否以{{1开头或0(我们无需检查+,因为它包含在00检查中)。如果您能够删除检查0列的要求,则可以删除text版本并可能加快速度,因为nvarchar(3)不支持text 1}}查询。

要搜索多个数据库,请查看sp_MSForeachdb

答案 1 :(得分:0)

如果您正在使用Oracle数据库,在您的循环中使用EXECUTE IMMEDIATE创建一个sql语句,Web上有许多资源,其中一个就是这个资源http://www.dba-oracle.com/t_oracle_execute_immediate.htm)。 使用EXECUTE IMMEDIATE可以构建sql语句。 希望能帮助到你。 (对不起,我刚刚看到你正在使用sql server但有相同的东西:http://social.msdn.microsoft.com/Forums/en/transactsql/thread/4572e8eb-265c-4e6d-b501-22eef2111caf