搜索当前数据库中含有指定字符串的表列

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
if exists (select * from dbo.sysobjects
                where id = object_id(N'[dbo].[spFindTextInColumns]')
                      and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[spFindTextInColumns]
GO

/*
    搜索当前数据库中含有指定字符串的表列

    调用:
    EXECUTE spFindTextInColumns 'AA', 'tcart' --搜索指定表
    EXECUTE spFindTextInColumns default, 'tcart' --搜索所有表
    EXECUTE spFindTextInColumns default, '[吖-丫]' --搜索中文
   
*/
IF OBJECT_ID('spFindTextInColumns') IS NOT NULL
DROP PROCEDURE spFindTextInColumns
GO
CREATE PROCEDURE spFindTextInColumns (@TableName sysname = NULL,
 @StringToLookFor varchar(500))
AS

 DECLARE @columnName nvarchar(128),
  @dateType nvarchar(128),
  @row smallint,
  @rowCount int,
  @sql nvarchar(1000)

 DECLARE string_find_cursor CURSOR FAST_FORWARD FOR
  SELECT [name]
  FROM SYSOBJECTS
  WHERE (
    OBJECTPROPERTY(id, N'IsMsShipped') = 0
    AND OBJECTPROPERTY(id, N'IsUserTable') = 1
   ) AND (@TableName IS NULL OR [name] = @TableName)
  ORDER BY [name]
 
 OPEN string_find_cursor
 
 FETCH NEXT FROM string_find_cursor
 INTO @tableName
 
 SET @StringToLookFor = '%' + @StringToLookFor + '%'
 
 WHILE @@FETCH_STATUS = 0
 BEGIN
  SET @row = 1
 
  SELECT @rowCount = MAX([ORDINAL_POSITION])
  FROM [INFORMATION_SCHEMA].[COLUMNS]
  WHERE [TABLE_NAME] = @tableName
  GROUP BY [ORDINAL_POSITION]
 
  WHILE @row <= @rowCount
  BEGIN
   SELECT @columnName = '[' + [COLUMN_NAME] + ']',
    @dateType = [DATA_TYPE]
   FROM [INFORMATION_SCHEMA].[COLUMNS]
   WHERE [TABLE_NAME] = @tableName
    AND [ORDINAL_POSITION] = @row
   ORDER BY [ORDINAL_POSITION]
 
   SET @row = @row + 1
   
   SET @sql = NULL
 
   IF @dateType IN ( N'char', N'varchar', N'text')
    SET @sql = 'SELECT * FROM [' + @tableName + '] WHERE PATINDEX(''' + @StringToLookFor + ''', ' + @columnName + ') > 0'
   ELSE IF @dateType IN (N'nchar', N'nvarchar', N'ntext')
    SET @sql = 'SELECT * FROM [' + @tableName + '] WHERE PATINDEX(''' + @StringToLookFor + ''', CAST(' + @columnName + ' As TEXT)) > 0'
   
   IF @sql IS NOT NULL
   BEGIN
    SET @sql = 'IF EXISTS(' + @sql + ') PRINT ''[' + @tableName + '].' + @columnName + ''''
    --PRINT (@sql)
    EXEC (@sql)
   END
  END
 
  FETCH NEXT FROM string_find_cursor
  INTO @tableName
 END
 
 CLOSE string_find_cursor
 DEALLOCATE string_find_cursor
GO

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值