在包含特定列的每个表中运行查询

时间:2016-10-27 08:56:50

标签: sql-server

我运行此查询以获取包含特定列名称的所有表

SELECT * FROM table WHERE myColumn = xxx

然后,对于每个表,我想运行如下的查询:

<script src="https://code.highcharts.com/highcharts.js"></script>
<script src="http://code.highcharts.com/stock/highstock.js"></script>
<script src="https://code.highcharts.com/modules/funnel.js"></script>
<script src="https://code.highcharts.com/modules/exporting.js"></script>

有没有办法自动执行并对第一个查询中的所有表运行第二个查询?

我有一个相当大的数据库,我想检查是否有任何地方存储有关myColumn上特定Id的内容。此列用于约200个表。

3 个答案:

答案 0 :(得分:1)

我猜你需要使用动态查询。在这里我将Schema结果保存在表变量中,然后循环遍历它们以生成所需的查询。请尝试下面的内容:

DECLARE @Template varchar(max)='SELECT * FROM [TABLE_NAME] WHERE [COLUMN_NAME] = ''xxx''';
DECLARE @CMD varchar(max);
DECLARE @id int=1, @TABLE_NAME varchar(255), @COLUMN_NAME varchar(255)

declare @Table table(id int identity(1,1), COLUMN_NAME varchar(255), TABLE_NAME varchar(255))

    INSERT INTO @Table (TABLE_NAME, COLUMN_NAME)
    SELECT  TABLE_NAME, COLUMN_NAME
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE COLUMN_NAME LIKE '%Label%'


    SELECT @id=ID, @TABLE_NAME = TABLE_NAME, @COLUMN_NAME = COLUMN_NAME FROM @Table WHERE ID = @id
    While @@ROWCOUNT>0 BEGIN
        SET @CMD = REPLACE(@Template, '[TABLE_NAME]', @TABLE_NAME)
        SET @CMD = REPLACE(@CMD, '[COLUMN_NAME]', @COLUMN_NAME)
        Print @cmd
        EXEC (@CMD)
        SELECT @id=ID, @TABLE_NAME = TABLE_NAME, @COLUMN_NAME = COLUMN_NAME FROM @Table WHERE ID = @id + 1
    End

答案 1 :(得分:0)

您可以按照以下方式执行此操作。该脚本在VARCHAR中构建所有SELECT语句,然后动态执行。适用于整数和varchars。

DECLARE @col_name SYSNAME='myColumn';
DECLARE @expected_value NVARCHAR(256)='xxx';
DECLARE @sel_stmts NVARCHAR(MAX) = (
    SELECT 
        ';SELECT '+
            '* '+
        'FROM '+
            QUOTENAME(t.TABLE_SCHEMA)+'.'+QUOTENAME(t.TABLE_NAME) +
        'WHERE '+
            QUOTENAME(c.COLUMN_NAME)+'='''+REPLACE(@expected_value,'''','''''')+''''
    FROM 
        INFORMATION_SCHEMA.TABLES AS t
        INNER JOIN INFORMATION_SCHEMA.COLUMNS AS c ON
            c.TABLE_SCHEMA=t.TABLE_SCHEMA AND
            c.TABLE_NAME=t.TABLE_NAME
    WHERE
        t.TABLE_TYPE='BASE TABLE' AND
        c.COLUMN_NAME LIKE '%'+@col_name+'%'
    FOR
        XML PATH('')
)+';';

--SELECT @sel_stmts; -- review
EXEC sp_executesql @sel_stmts; -- execute it

答案 2 :(得分:0)

我对艾哈迈德·塞伊德(Ahmed Saeed)的答案做了几处更改,这对我很有帮助,因此请在此处发布

  1. 为具有多个模式的数据库添加模式名称
  2. 在模式/数据库名称中添加一个额外的[],以防其中一个名称也是关键字
  3. 打印带有结果的表名
DECLARE @Template varchar(max)='SELECT ''[TABLE_NAME]'' as TableName, * FROM [[DBSCHEMA_NAME]].[[TABLE_NAME]] WHERE [COLUMN_NAME] = ''xxx''';
DECLARE @CMD varchar(max);
DECLARE @id int=1, @DBSCHEMA_NAME varchar(255), @TABLE_NAME varchar(255), @COLUMN_NAME varchar(255)

declare @Table table(id int identity(1,1), COLUMN_NAME varchar(255), TABLE_NAME varchar(255), DBSCHEMA_NAME varchar(255))

    INSERT INTO @Table (TABLE_NAME, COLUMN_NAME, DBSCHEMA_NAME)
    SELECT  TABLE_NAME, COLUMN_NAME, TABLE_SCHEMA
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE COLUMN_NAME LIKE '%colname%'


    SELECT @id=ID, @DBSCHEMA_NAME = DBSCHEMA_NAME, @TABLE_NAME = TABLE_NAME, @COLUMN_NAME = COLUMN_NAME FROM @Table WHERE ID = @id
    While @@ROWCOUNT>0 BEGIN
        SET @CMD = REPLACE(@Template, '[TABLE_NAME]', @TABLE_NAME)
        SET @CMD = REPLACE(@CMD, '[COLUMN_NAME]', @COLUMN_NAME)
        SET @CMD = REPLACE(@CMD, '[DBSCHEMA_NAME]', @DBSCHEMA_NAME)
        Print @cmd
        EXEC (@CMD)
        SELECT @id=ID, @DBSCHEMA_NAME = DBSCHEMA_NAME, @TABLE_NAME = TABLE_NAME, @COLUMN_NAME = COLUMN_NAME FROM @Table WHERE ID = @id + 1
    End