我需要循环遍历每个数据库表和每列,看它是否包含电话号码。 任何以文本+或00或0开头的内容。
我找到了遍历列名的代码/游标,但它们不搜索实际数据。 我有什么想法可以做到这一点吗?
答案 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
这将搜索包含varchar
,nvarchar
,char
,nchar
,text
列的所有表,并查看它是否以{{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)