有的时候,我们想知道包含特定字符的表都有哪些,怎么办呢?其实很简单:SELECT * FROM
dbo.MyCustomer WHERE CustomerName LIKE
‘%AA%‘ 这个样子的SQL我们都不陌生,很简单的查询。再回过来看下我们现在遇到的问题:我们不知道表的名称、字段的名称,那我们只要列出所有的表和对应的字段然后遍历一下就可以了,换句话说,我们只需要把上面的表名【MyCustomer】和字段名【CustomerName】替换成变量就可以。有了SQL语句通过【EXEC】我们就可以做到想查什么就有什么了。下面我们来看下具体的实现方式,为了方便使用,我们把整个实现包装成一个存储过程:
CREATE PROCEDURE [dbo].[查找含有指定字符的表]
(
@value VARCHAR(1024)
)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @sql VARCHAR(1024)
DECLARE @table VARCHAR(64)
DECLARE @column VARCHAR(64)CREATE TABLE #t (
tablename VARCHAR(64),
columnname VARCHAR(64)
)DECLARE TABLES CURSOR
FORSELECT o.name, c.name
FROM syscolumns c
INNER JOIN sysobjects o ON c.id = o.id
WHERE o.type = ‘U‘ AND c.xtype IN (167, 175, 231, 239)
ORDER BY o.name, c.nameOPEN TABLES
FETCH NEXT FROM TABLES
INTO @table, @columnWHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = ‘IF EXISTS(SELECT NULL FROM [‘ + @table + ‘] ‘
SET @sql = @sql + ‘WHERE RTRIM(LTRIM([‘ + @column + ‘])) LIKE ‘‘%‘ + @value + ‘%‘‘) ‘
SET @sql = @sql + ‘INSERT INTO #t VALUES (‘‘‘ + @table + ‘‘‘, ‘‘‘
SET @sql = @sql + @column + ‘‘‘)‘PRINT @sql
EXEC(@sql)FETCH NEXT FROM TABLES
INTO @table, @column
ENDCLOSE TABLES
DEALLOCATE TABLESSELECT *
FROM #tDROP TABLE #t
END
--调用方式
EXEC [查找含有指定字符的表] ‘AAA‘
上面就是查询结果,我们查询的是所有包含AAA的表和对应的字段名称。这只是一个解决方案,不是很完美。比方上面的查询当数据库比较庞大时,执行会比较耗时。园子里面的朋友有好解决方案可以@下我,相互学习。