none
有没有如何查询含有字段为y,y的值是x的所有表名的sql语句? RRS feed

  • 问题

  • 如何查询含有字段为k,k的值是x的所有表名?例如,如何查询含有字段是name,name的值为张三的所有表名?尽可能不用程序代码实现(有的话时间别超过5秒),查询时间别超过5秒.我不想先查所有表名,之后在挨个查,

    表名是动态生成的,这些动态生成的表都是某个表的从表.这些从表结构相同

    sql server能否实现,sqlite能否实现?



    2016年8月24日 2:25

答案

  • 时间的明显取决于满足条件的表数量和数据量,跟方法无关,无法控制

    USE 你的库名;
    
    DECLARE @sql nvarchar(4000);
    DECLARE @t TABLE(name nvarchar(760));
    
    DECLARE CUR CURSOR LOCAL FORWARD_ONLY READ_ONLY FOR
    SELECT 'SELECT N''' + REPLACE(obj, N'''', N'''''') + N'
    WHERE EXISTS(
    	SELECT * FROM ' + obj + N' WITH(NOLOCK)
    	WHERE ' + QUOTENAME(name) + N' = ''x'' -- 是否有包含 x 值的字段
    	);'
    FROM( -- 包含 k 字段的表
    	SELECT name, obj = QUOTENAME(OBJECT_SCHEMA_NAME(object_id)) + N'.' + QUOTENAME(OBJECT_NAME(object_id))
    	FROM sys.columns WHERE name = 'k'
    ) DATA
    ;
    OPEN CUR;
    WHILE 1 = 1
    BEGIN;
    	FETCH CUR INTO @sql;
    	IF NOT @@FETCH_STATUS = 0 BREAK;
    	INSERT @t EXEC(@sql);
    END;
    CLOSE CUR; DEALLOCATE CUR;
    
    SELECT * FROM @t;
    

    2016年8月24日 2:48

全部回复

  • 时间的明显取决于满足条件的表数量和数据量,跟方法无关,无法控制

    USE 你的库名;
    
    DECLARE @sql nvarchar(4000);
    DECLARE @t TABLE(name nvarchar(760));
    
    DECLARE CUR CURSOR LOCAL FORWARD_ONLY READ_ONLY FOR
    SELECT 'SELECT N''' + REPLACE(obj, N'''', N'''''') + N'
    WHERE EXISTS(
    	SELECT * FROM ' + obj + N' WITH(NOLOCK)
    	WHERE ' + QUOTENAME(name) + N' = ''x'' -- 是否有包含 x 值的字段
    	);'
    FROM( -- 包含 k 字段的表
    	SELECT name, obj = QUOTENAME(OBJECT_SCHEMA_NAME(object_id)) + N'.' + QUOTENAME(OBJECT_NAME(object_id))
    	FROM sys.columns WHERE name = 'k'
    ) DATA
    ;
    OPEN CUR;
    WHILE 1 = 1
    BEGIN;
    	FETCH CUR INTO @sql;
    	IF NOT @@FETCH_STATUS = 0 BREAK;
    	INSERT @t EXEC(@sql);
    END;
    CLOSE CUR; DEALLOCATE CUR;
    
    SELECT * FROM @t;
    

    2016年8月24日 2:48
  • 如果是所有库,再包含一层循环数据库(sys.databases)的游标在最外面
    • 已建议为答案 Stone Z 2016年8月24日 10:02
    2016年8月24日 2:49
  • 如果是所有库,再包含一层循环数据库(sys.databases)的游标在最外面

    想起来当年遇到的一个客户,sql server被注入了,要检查所有varchar字段是否包含被注入的js脚本。差不多就是这个样写的。

    替换效率太低,只能停业务,备份出来替换好后在更新回去。


    family as water

    2016年8月24日 10:04