SQLServer全實例搜索關鍵字


  本例腳本旨在所有數據庫的所有數據中搜索關鍵字,可將以下腳本直接拷貝使用,注意留意注解。本例的核心思路是用游標遍歷所有數據庫中所有表的所有列,用列名對關鍵字進行匹配,對匹配結果進行判斷,然后只輸出有關鍵字的信息。

  在本例中,關掉了影響行數的信息,在查詢結果的massage欄中,會出現一些Level 16的warning信息,大部分都是因為搜索到某些特殊數據類型的字段(XML,sql_variant,image等),不能用convert函數轉換為varchar類型,此報警信息可以忽略~

  如:Implicit conversion from data type xml to varchar is not allowed. Use the CONVERT function to run this query.

  或者是出現了排序規則不一致的信息,比如在英文環境下,某些字段名是中文等 :

  如:Invalid column name '?????'.

  在使用此腳本的過程中,可以留意到腳本中有print函數被注釋了,如果需要觀察SQL動態語句最后的真實形態,可以重新啟用print函數來比對。

drop table #Retrieve
set nocount on
Declare @UserDB varchar(200)
declare @str varchar(200)
set @str='AmazonHostReservat' --your string to be retrieved將@str的值換成要查的字符串!
create table #Retrieve(Retrieve_Info varchar(200))

Declare DBName cursor
            for
select name from sys.databases where name not in
                                                          (N'master', N'model', N'msdb', N'tempdb', N'distribution', N'DWDiagnostics', N'DWConfiguration', N'DWQueue', N'resource',N'ReportServer',N'ReportServerTempDB')


--Note:若可以明確所查關鍵字在哪個數據庫(比如A)中,可以將上一行where name not in
--(N'master', N'model', N'msdb', N'tempdb', N'distribution', N'DWDiagnostics', N'DWConfiguration', N'DWQueue', --N'resource',N'ReportServer',N'ReportServerTempDB')改為where name in ('A')


open DBName;
fetch next from DBName into @UserDB;
while @@FETCH_STATUS=0
begin
    Declare @column_sql varchar(1000)
    set @column_sql=
    'DECLARE columnCursor CURSOR FOR SELECT ''['' + table_catalog + ''].['' + table_schema + ''].['' +
     table_name + '']'' as tableName,''['' + table_catalog + ''].['' + table_schema + ''].['' +
     table_name + ''].['' + column_name + '']'' as columnName FROM [' + @UserDB + '].INFORMATION_SCHEMA.columns a
     where a.table_NAME in (select name from '+quotename(@UserDB,'[]')+'.sys.tables) and a.table_NAME <>'+'''sysdiagrams'''
    --print(@column_sql)
    exec(@column_sql)
    declare @Column_name varchar(500)
    declare @tablename varchar(500)
    open columnCursor
    fetch next from columnCursor into @tablename,@Column_name;
    while @@FETCH_STATUS=0
        begin
        declare @retrieve varchar(1000)
        declare @retrieve2 varchar(1000)
        declare @count int
        set @retrieve='declare @rowcount int;
        select '+@Column_name+' from '+@tablename+' where quotename(convert(varchar(200),'+@Column_name+'),'''') like '+QUOTENAME('%'+@str+'%','''')
        --print (@retrieve)
        insert into #Retrieve exec (@retrieve)
        select @count=count(1) from #Retrieve
        if @count>0
        begin
            set @retrieve2='select '+quotename(@tablename,'''')+' as Tablename , * from '+@tablename+' where quotename(convert(varchar(200),'+@Column_name+'),'''') like '+QUOTENAME('%'+@str+'%','''')
            --print (@retrieve2)
            exec (@retrieve2)
            delete from #Retrieve  
            fetch next from columnCursor into @tablename,@Column_name;
        end        
        else            
        fetch next from columnCursor into @tablename,@Column_name;
        end
        close columnCursor
        DEALLOCATE columnCursor
    fetch next from DBName into @UserDB;
end
        close DBName
        DEALLOCATE DBName
set nocount off   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM