Я использую 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