Не отображать пустые множества возврата

115
14

У меня есть следующий код sql:

select 'select * from ' + table_name + ' where ' + column_name + ' = 123'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME like '%columnOfInterest%'

Для данной базы данных это просматривает все таблицы, в которых есть столбец с именем columnOfInterest который содержит значение 123. Это предназначено для целей отладки, и поэтому вывод не должен быть красивым, и это, конечно же, не так. В большинстве таблиц нет столбца, а у тех, у которых еще меньше, есть значение 123, поэтому большинство возвращаемых наборов пустые.
Я ищу способы аккуратного вывода. Например, мне вообще не нужно видеть пустые множества. Любые идеи о том, как это сделать или очистить в противном случае?
Приложен скриншот выхода в SQL Server Manage. Мне пришлось удалить некоторые потенциально чувствительные имена столбцов. Синими столбцами являются columnOfInterest, черный, все остальные. Каждая строка, которую вы видите здесь, представляет собой пустой вывод из 1 таблицы.

enter image description here

спросил(а) 2014-07-17T22:31:00+04:00 6 лет, 3 месяца назад
1
Решение
57

оберните динамический запрос в блок IF, который проверяет, вернет ли запрос что-либо.

select 'if exists (' + QUERY + ')' + char(10) + '    ' + QUERY
from (
select QUERY = 'select * from ' + TABLE_NAME
+ ' where ' + COLUMN_NAME + ' = 123'
from INFORMATION_SCHEMA.COLUMNS
where COLUMN_NAME like '%columnOfInterest%'
) q

ответил(а) 2014-07-17T23:07:00+04:00 6 лет, 3 месяца назад
58

Это должно возвращать имена таблиц с именем столбца. Будет ли это делать?


DECLARE @Tsql NVARCHAR(MAX)
SET @Tsql = ''
select @Tsql = @Tsql + 'select TOP(1) ''' + c.table_schema + '.' + c.table_name + ''' AS TableName, ''' + c.COLUMN_NAME + ''' AS ColumnName from ' + c.table_schema + '.' + c.table_name + ' where EXISTS
(SELECT 1 FROM ' + c.table_schema + '.' + c.table_name + ' WHERE ' + c.column_name + ' = 123) UNION' + CHAR(13) + CHAR(10)
FROM INFORMATION_SCHEMA.COLUMNS c
WHERE c.COLUMN_NAME like '%SomeColumnName%'
--You may want to filter on data type here. Did I leave anything out?
AND c.data_type IN ('BIGINT', 'INT', 'TINYINT', 'SMALLINT', 'NUMBER', 'DECIMAL', 'MONEY')

SELECT @Tsql = LEFT(@Tsql, LEN(@Tsql) - 7)

PRINT @Tsql

--EXEC sp_executesql @Tsql

ответил(а) 2014-07-17T23:04:00+04:00 6 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема