Выберите каждую строку из каждой таблицы в базе данных, где (columnName = значение), если существует имя столбца - PullRequest
2 голосов
/ 03 декабря 2010

Я использую SQL Server 2005 и вошел в систему как sa.Я хотел бы запросить каждую таблицу в моей базе данных, есть ли у нее определенное имя столбца.И если так, добавьте каждую строку, где (columnNameValue = someValue) к таблице результатов.Затем верните указанную таблицу результатов.

Есть несколько похожих проблем с решениями.Примечательно, что я могу использовать sp_MSForeachTable для этого, но в нем отсутствует какая-либо документация.Я могу использовать SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES, чтобы получить список всех таблиц.

Следующее решение ( текст ссылки ) будет проходить каждую таблицу и каждый столбец, чтобы найти определенное значение в ячейке.Что отличается от нахождения определенного значения в ячейке, ЕСЛИ этот столбец является определенным columnName.

Запись вложенного оператора while должна быть возможной, но есть ли какие-либо встроенные команды для выполнения таких запросов?

Псевдокод, если он помогает:

foreach(table in tableList) {
    if (table.hasColumnName(SOME_COLUMN) {
       EXEC ('SELECT * FROM table WHERE (SOME_COLUMN = SOME_VALUE)')
    }
}

[Редактировать]

Вместо того, чтобы иметь один набор результатов, я хотел бы быть одним результатом на таблицу, пока выбор возвращаетсяхотя бы один ряд.Это должно привести к очень большому количеству различных результатов, так как ожидать, что объединение или объединение не будут работать.

Если возможно, я хотел бы добавить имя таблицы к началу каждого результата.

У меня естьпростой запрос ниже, который получает все результаты, но он отображает пустые таблицы и не дает никаких визуальных указаний в отдельных результатах относительно того, к какой таблице он принадлежит:

[Далее редактировать]

ОбновленПриведенный ниже запрос включает проверку IF EXIST, которая удаляет результаты NULL и столбец источника AS с именем выбора, чтобы добавить источник таблицы к результатам благодаря @ Martin

DECLARE @COLUMN_VALUE nvarchar(512), @VALUE nvarchar(10);

SET @COLUMN_VALUE = 'id'
SET @VALUE = '0';

DECLARE @TABLE_NAME nvarchar(512), @COLUMN_NAME nvarchar(512), @QUERY nvarchar(512);

SET @TABLE_NAME = '';

WHILE @TABLE_NAME IS NOT NULL
BEGIN
    SET @TABLE_NAME =
    (
        SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
        FROM INFORMATION_SCHEMA.TABLES
        WHERE QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TABLE_NAME
    );
    PRINT 'Table name : ' + @TABLE_NAME;
    SET @COLUMN_NAME = 
    (
        SELECT MIN(QUOTENAME(COLUMN_NAME))
        FROM INFORMATION_SCHEMA.COLUMNS
        WHERE (TABLE_NAME = PARSENAME(@TABLE_NAME, 1))
            AND (COLUMN_NAME = @COLUMN_VALUE)

    );
    PRINT 'Column name : ' + @COLUMN_NAME;
    IF @COLUMN_NAME IS NOT NULL 
    BEGIN
        SET @QUERY = 
            'SELECT ''' + @TABLE_NAME + ''' AS Source, * ' +
            'FROM ' + @TABLE_NAME + ' ' +
            'WHERE (' + @COLUMN_NAME + ' = ' + @VALUE + ')'
        EXEC
        (
            'IF EXISTS(' + @QUERY + ') ' + @QUERY
        )
    END     
END

1 Ответ

7 голосов
/ 03 декабря 2010
CREATE TABLE foo
(
SOME_COLUMN VARCHAR(10)
)

CREATE TABLE bar
(
SOME_COLUMN VARCHAR(10)
)

INSERT INTO bar VALUES ('SOME_VALUE')


DECLARE @Query nvarchar(max)

SELECT 
      @Query = isnull(@Query + ';','') + 
      'IF EXISTS(SELECT * FROM ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + 
      QUOTENAME(o.name) + ' WHERE SOME_COLUMN=''SOME_VALUE'')
      SELECT ''' + o.name +''' AS Source, * FROM ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + 
      QUOTENAME(o.name) + ' WHERE SOME_COLUMN=''SOME_VALUE'''
FROM sys.columns c 
JOIN sys.objects o
ON o.object_id = c.object_id
WHERE o.type IN ('U','V') AND c.name = 'SOME_COLUMN'

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