Как найти во всех таблицах, содержащих столбцы, имеющие определенные значения? - PullRequest
3 голосов
/ 09 декабря 2011

Моя цель - найти всю таблицу из базы данных, имеющую данный столбец с определенным значением. то есть У меня есть таблицы, такие как Table1, Table2, Table3, Table4, Table5, Table6, Table7 и т. Д.

В этих таблицах некоторые таблицы имеют имя столбца «NameID». Теперь я хочу выяснить таблицы с именем столбца «NameID» и значением 100.

Может кто-нибудь сказать мне, как написать SQL Query для этого?

Ответы [ 4 ]

1 голос
/ 09 декабря 2011

Да, вы можете использовать INFORMATION_SCHEMA, которая позволяет самописцу MS SQL.

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'NameID'
0 голосов
/ 27 апреля 2013

Вы можете использовать мой поисковый скрипт со следующими параметрами:

SET @SearchStrColumnValue = '100' /* use LIKE syntax */
SET @FullRowResult = 1
SET @SearchStrTableName = 'TABLE%' /* NULL for all tables, uses LIKE syntax */
SET @SearchStrColumnName = 'NameID' /* NULL for all columns, uses LIKE syntax */
SET @SearchStrInXML = 0 /* Searching XML data may be slow */

http://fullparam.wordpress.com/2012/09/07/fck-it-i-am-going-to-search-all-tables-all-collumns/

0 голосов
/ 22 февраля 2012

Нужно было сделать что-то подобное, для нас это был TransactionID.Я взял предложение Пола Алана Тейлора и MakeMinePanacea и добавил курсор.Это быстро и грязно, но работает на 1 выкл.

DECLARE @TableName varchar(MAX)
DECLARE @Sql VARCHAR(MAX)
set @Sql = ''
DECLARE @Tables CURSOR

SET @Tables = CURSOR FOR

    SELECT t.Table_Name
    FROM INFORMATION_SCHEMA.COLUMNS c
    JOIN INFORMATION_SCHEMA.TABLES t on c.Table_Name = t.Table_Name
    WHERE COLUMN_NAME = 'TransactionID' and table_type = 'BASE TABLE'

OPEN @Tables
FETCH NEXT
FROM @Tables INTO @TableName

WHILE @@FETCH_STATUS = 0
BEGIN
    if len(@Sql) > 0
    BEGIN
        set @SQL = @SQL + ' UNION ALL '
    END

    set @Sql = @Sql + 'SELECT ''' + @TableName + ''' FROM [' + @TableName + '] WHERE transactionid = 100'

    FETCH NEXT
    FROM @Tables INTO @TableName
END
CLOSE @Tables
DEALLOCATE @Tables

exec (@Sql)
0 голосов
/ 09 декабря 2011

Если вы не можете перечислить таблицы, я сомневаюсь, что вы можете сделать это в запросе.Вам нужно будет динамически создать запрос (используя таблицы, которые вы нашли, как показал Пол Алан Тейлор).

Попробуйте изменить это:

http://ubercode.bleakllc.com/2008/11/find-any-value-in-any-database-column.html

Если вы уже знаете все таблицы, в которых есть столбец, и этот список таблиц не подлежит изменению, тоВы можете выполнить простой запрос, например

  Select 'Table1' from table1 where id = 100
  UNION
  Select 'Table2' from table2 where id = 100
  UNION
  ...

UNION выбросит все дубликаты, поэтому, если несколько строк имеют идентификатор 100, вы получите таблицу только один раз, если это не то, что вы хотите UNION ALL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...