我有以下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表中的空输出。
答案 0 :(得分:1)
这应该返回带有列名的表名。这会吗?
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
答案 1 :(得分:1)
将动态查询包装在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