sqlserver语法

GU天乐乐乐! / 2024-09-27 / 原文

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'sp_FindString') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
    DROP PROCEDURE sp_FindString
GO
  
 /* 
    gzt-202409
    这里是sqlserver数据库
    查询方式:exec sp_FindString '%张三%'
    查询字符串在哪些表那些列存在
    快速根据页面上显示的文字字符串定位到数据库的哪些关联表中
  */
CREATE PROCEDURE [dbo].[sp_FindString]
(
    @old_string varchar(50)
)    
as    
begin    
    declare @tbname varchar(50)    
    declare tbroy cursor for 
        select name from sysobjects where xtype= 'U ' --第一个游标遍历所有的表    
    open tbroy    
    fetch next from tbroy into @tbname    
    while @@fetch_status=0    
    begin  
        declare @colname varchar(500)    
        declare colroy cursor for select name from syscolumns where id=object_id(@tbname) and xtype in    
        (select xtype from systypes where name in ( 'varchar', 'nvarchar', 'char', 'nchar', 'text', 'int'  
        , 'decimal', 'float', 'int', 'money')) --第二个游标是第一个游标的嵌套游标,遍历某个表的所有字段    
        open colroy    
        fetch next from colroy into @colname    
        while @@fetch_status=0    
        begin
             if(@colname=@old_string)  
            begin  
              print '包含有列的表'+ @colname +'包含有列的表'+@tbname    
            end  
  
            declare @sql nvarchar(1000),@j int    
            select @sql= 'select @i=count(1) from ' + '[' + @tbname + ']' + ' where '+ '[' + @colname + ']'+ ' like '+ ''''+ @old_string + ''''
             --select @sql    
            exec dbo.sp_executesql @sql,N'@i int output', @i = @j output --输出满足条件表的记录数    
            if @j> 0    
            begin
                select 包含字串的表名 = @tbname ,包含字串的列名 = @colname    
               select @sql = 'select ' + @colname + ',* from ' + @tbname + ' where '+ @colname + ' like '+ '''' + @old_string + ''''    
              print @sql     
            end 
        fetch next from colroy into @colname    
        end    
        close colroy    
        deallocate colroy 
     fetch next from tbroy into @tbname    
    end    
    close tbroy    
    deallocate tbroy    
end