0

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

我找到了循环遍历列名的代码/游标,但它们不搜索实际数据。任何想法我怎么能做到这一点?

4

2 回答 2

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

这将搜索所有具有varchar, nvarchar, char, nchar,text列的表,并查看它是否以0or开头+(我们不需要检查,00因为它包含在0检查中)。如果您能够摆脱检查text列的要求,您可以删除nvarchar(3)铸件并可能加快速度,因为text不支持like查询,所以铸件已完成。

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

于 2013-02-06T15:47:11.543 回答
0

如果您使用的是 Oracle 数据库,请在循环中使用 EXECUTE IMMEDIATE 创建一个 sql 语句,网络上有很多资源,其中之一是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 )

于 2013-02-06T15:44:56.323 回答