关于sql查询库中所有表的问题

tj_libo 2018-05-11 02:34:31
现有一需求,需要查询库中所有包含某值,并且某列的值等于指定内容的所有表信息,
如整个库中 查找值=‘123’,并且ID列的值=1的所有表名,123所对应的字段名,
例:表A 有字段
id,name,age,sex
1 123 12 男
2 223 12 男
3 123 12 女
表B有
id,class,name,like
1 234 222 唱歌
1 123 232 跳舞
2 123 123 跑步
现查找含有123的,id=1的数据结果为
表名 列名
表A name
表B class

请大神帮忙,现在可以查询包含123的表信息,但无法加条件(id=1)
查找所有包含123的存储过程为:
CREATE PROCEDURE [dbo].[SP_FindValueInDB]
(
@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
FOR

SELECT 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.name

OPEN TABLES

FETCH NEXT FROM TABLES
INTO @table, @column

WHILE @@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 + ''')'

EXEC(@sql)

FETCH NEXT FROM TABLES
INTO @table, @column
END

CLOSE TABLES
DEALLOCATE TABLES

SELECT *
FROM #t

DROP TABLE #t

End
GO

如何在此基础上添加条件id=1 或者有没有其他方法实现?
...全文
1127 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tj_libo 2018-06-01
  • 打赏
  • 举报
回复
(97 行受影响) (0 行受影响) (3 行受影响) 消息 241,级别 16,状态 1,第 1 行 从字符串转换日期和/或时间时,转换失败。
shinger126 2018-05-14
  • 打赏
  • 举报
回复
额,你要查找的是字符串或者文本类型的列,所以在循环取列名的那里,要限制一下列的数据类型 DECLARE col CURSOR FOR SELECT name FROM syscolumns a WHERE OBJECT_NAME(id)=@table AND EXISTS(SELECT 1 FROM sys.types b WHERE system_type_id=a.xtype AND b.name IN ('int','smallint','bigint','real','money','float','char','varchar', 'nchar','nvarchar','decimal','numeric') 你只要char,varchar,nchar,nvarchar,text,ntext这些类型的列就可以了吧
tj_libo 2018-05-14
  • 打赏
  • 举报
回复
出现错误 消息 8114,级别 16,状态 5,第 1 行 从数据类型 varchar 转换为 float 时出错。
shinger126 2018-05-11
  • 打赏
  • 举报
回复
引用 6 楼 tj_libo 的回复:
[quote=引用 5 楼 shinger126 的回复:] [quote=引用 4 楼 shinger126 的回复:] DECLARE @table VARCHAR(300),@col VARCHAR(300) DECLARE @sql VARCHAR(4000) CREATE TABLE #t(tablename VARCHAR(300),colname VARCHAR(300)) DECLARE c CURSOR FOR SELECT name FROM sysobjects a WHERE a.xtype='U' AND EXISTS(SELECT 1 FROM syscolumns b WHERE b.id=a.id AND b.name='id') OPEN c FETCH NEXT FROM c INTO @table WHILE @@FETCH_STATUS=0 BEGIN DECLARE col CURSOR FOR SELECT name FROM syscolumns a WHERE OBJECT_NAME(id)=@table AND EXISTS(SELECT 1 FROM sys.types b WHERE system_type_id=a.xtype AND b.name IN ('int','smallint','bigint','real','money','float','char','varchar', 'nchar','nvarchar','decimal','numeric') ) OPEN col FETCH NEXT FROM col INTO @col WHILE @@FETCH_STATUS=0 BEGIN SET @sql='if exists(select 1 from '+@table+' where id=1 and '+@col+'=''123'') insert into #t select '''+@table+''','''+@col+'''' PRINT @sql EXEC(@sql) FETCH NEXT FROM col INTO @col END CLOSE col DEALLOCATE col FETCH NEXT FROM c INTO @table end CLOSE c DEALLOCATE c SELECT * FROM #t 试试,如果你要是包含字符串‘123’的话,自己修改一下
SET @sql='if exists(select 1 from '+@table+' where id=1 and '+@col+'=''123'') insert into #t select '''+@table+''','''+@col+'''' 这里忘记加id=1的条件了[/quote] 加了id=1 后报错 我的表结构不是找id 上面需求是例子,实际条件是 IsExamine=‘已审核’ 加上此条件后,提示 消息 207,级别 16,状态 1,第 1 行 列名 'IsExamine' 无效。 消息 207,级别 16,状态 1,第 1 行 列名 'IsExamine' 无效。 消息 207,级别 16,状态 1,第 1 行 列名 'IsExamine' 无效。[/quote] 我这里是举例的,你要改的话,外面的游标条件要改啊 DECLARE c CURSOR FOR SELECT name FROM sysobjects a WHERE a.xtype='U' AND EXISTS(SELECT 1 FROM syscolumns b WHERE b.id=a.id AND b.name='IsExamine') 这样
tj_libo 2018-05-11
  • 打赏
  • 举报
回复
引用 5 楼 shinger126 的回复:
[quote=引用 4 楼 shinger126 的回复:] DECLARE @table VARCHAR(300),@col VARCHAR(300) DECLARE @sql VARCHAR(4000) CREATE TABLE #t(tablename VARCHAR(300),colname VARCHAR(300)) DECLARE c CURSOR FOR SELECT name FROM sysobjects a WHERE a.xtype='U' AND EXISTS(SELECT 1 FROM syscolumns b WHERE b.id=a.id AND b.name='id') OPEN c FETCH NEXT FROM c INTO @table WHILE @@FETCH_STATUS=0 BEGIN DECLARE col CURSOR FOR SELECT name FROM syscolumns a WHERE OBJECT_NAME(id)=@table AND EXISTS(SELECT 1 FROM sys.types b WHERE system_type_id=a.xtype AND b.name IN ('int','smallint','bigint','real','money','float','char','varchar', 'nchar','nvarchar','decimal','numeric') ) OPEN col FETCH NEXT FROM col INTO @col WHILE @@FETCH_STATUS=0 BEGIN SET @sql='if exists(select 1 from '+@table+' where id=1 and '+@col+'=''123'') insert into #t select '''+@table+''','''+@col+'''' PRINT @sql EXEC(@sql) FETCH NEXT FROM col INTO @col END CLOSE col DEALLOCATE col FETCH NEXT FROM c INTO @table end CLOSE c DEALLOCATE c SELECT * FROM #t 试试,如果你要是包含字符串‘123’的话,自己修改一下
SET @sql='if exists(select 1 from '+@table+' where id=1 and '+@col+'=''123'') insert into #t select '''+@table+''','''+@col+'''' 这里忘记加id=1的条件了[/quote] 加了id=1 后报错 我的表结构不是找id 上面需求是例子,实际条件是 IsExamine=‘已审核’ 加上此条件后,提示 消息 207,级别 16,状态 1,第 1 行 列名 'IsExamine' 无效。 消息 207,级别 16,状态 1,第 1 行 列名 'IsExamine' 无效。 消息 207,级别 16,状态 1,第 1 行 列名 'IsExamine' 无效。
shinger126 2018-05-11
  • 打赏
  • 举报
回复
引用 4 楼 shinger126 的回复:
DECLARE @table VARCHAR(300),@col VARCHAR(300) DECLARE @sql VARCHAR(4000) CREATE TABLE #t(tablename VARCHAR(300),colname VARCHAR(300)) DECLARE c CURSOR FOR SELECT name FROM sysobjects a WHERE a.xtype='U' AND EXISTS(SELECT 1 FROM syscolumns b WHERE b.id=a.id AND b.name='id') OPEN c FETCH NEXT FROM c INTO @table WHILE @@FETCH_STATUS=0 BEGIN DECLARE col CURSOR FOR SELECT name FROM syscolumns a WHERE OBJECT_NAME(id)=@table AND EXISTS(SELECT 1 FROM sys.types b WHERE system_type_id=a.xtype AND b.name IN ('int','smallint','bigint','real','money','float','char','varchar', 'nchar','nvarchar','decimal','numeric') ) OPEN col FETCH NEXT FROM col INTO @col WHILE @@FETCH_STATUS=0 BEGIN SET @sql='if exists(select 1 from '+@table+' where id=1 and '+@col+'=''123'') insert into #t select '''+@table+''','''+@col+'''' PRINT @sql EXEC(@sql) FETCH NEXT FROM col INTO @col END CLOSE col DEALLOCATE col FETCH NEXT FROM c INTO @table end CLOSE c DEALLOCATE c SELECT * FROM #t 试试,如果你要是包含字符串‘123’的话,自己修改一下
SET @sql='if exists(select 1 from '+@table+' where id=1 and '+@col+'=''123'') insert into #t select '''+@table+''','''+@col+'''' 这里忘记加id=1的条件了
shinger126 2018-05-11
  • 打赏
  • 举报
回复
DECLARE @table VARCHAR(300),@col VARCHAR(300) DECLARE @sql VARCHAR(4000) CREATE TABLE #t(tablename VARCHAR(300),colname VARCHAR(300)) DECLARE c CURSOR FOR SELECT name FROM sysobjects a WHERE a.xtype='U' AND EXISTS(SELECT 1 FROM syscolumns b WHERE b.id=a.id AND b.name='id') OPEN c FETCH NEXT FROM c INTO @table WHILE @@FETCH_STATUS=0 BEGIN DECLARE col CURSOR FOR SELECT name FROM syscolumns a WHERE OBJECT_NAME(id)=@table AND EXISTS(SELECT 1 FROM sys.types b WHERE system_type_id=a.xtype AND b.name IN ('int','smallint','bigint','real','money','float','char','varchar', 'nchar','nvarchar','decimal','numeric') ) OPEN col FETCH NEXT FROM col INTO @col WHILE @@FETCH_STATUS=0 BEGIN SET @sql='if exists(select 1 from '+@table+' where '+@col+'=''123'') insert into #t select '''+@table+''','''+@col+'''' PRINT @sql EXEC(@sql) FETCH NEXT FROM col INTO @col END CLOSE col DEALLOCATE col FETCH NEXT FROM c INTO @table end CLOSE c DEALLOCATE c SELECT * FROM #t 试试,如果你要是包含字符串‘123’的话,自己修改一下
tj_libo 2018-05-11
  • 打赏
  • 举报
回复
@value2 VARCHAR(1024) set @value2=‘1’ SET @sql = @sql + 'WHERE RTRIM(LTRIM([' + @column + '])) LIKE ''%' + @value + '%'' and RTRIM(LTRIM([' + @column + '])) LIKE ''%' + @value2 + '%'')' 查询结果是空的。。。
tj_libo 2018-05-11
  • 打赏
  • 举报
回复
引用 1 楼 fkcqzwx 的回复:
分两种情况,你说的这个,在循环里面的第二次给@sql斌值那一行中添加(见下面红色字体)。 WHILE @@FETCH_STATUS = 0 BEGIN SET @sql = 'IF EXISTS(SELECT NULL FROM [' + @table + '] ' SET @sql = @sql + 'WHERE RTRIM(LTRIM([' + @column + '])) LIKE ''%' + @value + '%'' ) and id = 1' SET @sql = @sql + 'INSERT INTO #t VALUES (''' + @table + ''', ''' SET @sql = @sql + @column + ''')' 第二种情况是,只检索部分表,可以在声明游标的时候加(见下面红色字体) DECLARE TABLES CURSOR FOR SELECT 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) and XXXX ORDER BY o.name, c.name OPEN TABLES gip EXEC(@sql)
并非所有表都有ID列,我尝试过在SET @sql = @sql + 'WHERE RTRIM(LTRIM([' + @column + '])) LIKE ''%' + @value + '%'' ) 的where后面加and条件 RTRIM(LTRIM([' + @column2 + '])) LIKE ''%' + @value2 + '%'' 查的结果与没加条件的一样
等待戈多12 2018-05-11
  • 打赏
  • 举报
回复
分两种情况,你说的这个,在循环里面的第二次给@sql斌值那一行中添加(见下面红色字体)。 WHILE @@FETCH_STATUS = 0 BEGIN SET @sql = 'IF EXISTS(SELECT NULL FROM [' + @table + '] ' SET @sql = @sql + 'WHERE RTRIM(LTRIM([' + @column + '])) LIKE ''%' + @value + '%'' ) and id = 1' SET @sql = @sql + 'INSERT INTO #t VALUES (''' + @table + ''', ''' SET @sql = @sql + @column + ''')' 第二种情况是,只检索部分表,可以在声明游标的时候加(见下面红色字体) DECLARE TABLES CURSOR FOR SELECT 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) and XXXX ORDER BY o.name, c.name OPEN TABLES gip EXEC(@sql)

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧