在SQL Server中查找包含两个特定列的表

Neo*_*Neo 2 t-sql sql-server information-schema database-metadata

我想在SQL Server中找到包含两个特定单独列的所有表.

第一列名称是"LIKE'%A%'"(意思是它包含子字符串"A"),第二列名称是"LIKE'%B%'"(意思是它包含子字符串"B").

我写了以下查询,我想检查它的正确性:

SELECT s.TABLE_NAME 
FROM (SELECT COLUMN_NAME, TABLE_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE COLUMN_NAME LIKE '%A%'
    UNION
    SELECT COLUMN_NAME, TABLE_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE COLUMN_NAME LIKE '%B%') s
WHERE EXISTS (SELECT COLUMN_NAME, s.TABLE_NAME 
              FROM INFORMATION_SCHEMA.COLUMNS
              WHERE COLUMN_NAME LIKE '%A%')
AND EXISTS (SELECT COLUMN_NAME, s.TABLE_NAME
            FROM INFORMATION_SCHEMA.COLUMNS
            WHERE COLUMN_NAME LIKE '%B%');  
Run Code Online (Sandbox Code Playgroud)

Shn*_*ugo 5

这应该更容易:

SELECT s.TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES AS s
WHERE s.TABLE_TYPE='BASE TABLE'
AND EXISTS (SELECT 1 
              FROM INFORMATION_SCHEMA.COLUMNS
              WHERE TABLE_NAME=s.TABLE_NAME AND COLUMN_NAME LIKE '%A%')
AND EXISTS (SELECT 1
            FROM INFORMATION_SCHEMA.COLUMNS
            WHERE TABLE_NAME=s.TABLE_NAME AND COLUMN_NAME LIKE '%B%');  
Run Code Online (Sandbox Code Playgroud)

UPDATE

使用此代码,您会发现所有列都适合作为列表的标准...

SELECT s.TABLE_NAME,listA,listB
FROM INFORMATION_SCHEMA.TABLES AS s
CROSS APPLY (SELECT STUFF(
             (
                 SELECT ', ' + COLUMN_NAME 
                 FROM INFORMATION_SCHEMA.COLUMNS
                 WHERE TABLE_NAME=s.TABLE_NAME AND COLUMN_NAME LIKE '%med%'
                 ORDER BY ORDINAL_POSITION
                 FOR XML PATH('')
             ),1,2,'')
             ) AS columnsWithA(listA)
CROSS APPLY (SELECT STUFF(
             (
                 SELECT ', ' + COLUMN_NAME 
                 FROM INFORMATION_SCHEMA.COLUMNS
                 WHERE TABLE_NAME=s.TABLE_NAME AND COLUMN_NAME LIKE 'kli%'
                 ORDER BY ORDINAL_POSITION
                 FOR XML PATH('')
             ),1,2,'')
             ) AS columnsWithB(listB)
WHERE s.TABLE_TYPE='BASE TABLE'
  AND listA IS NOT NULL AND listB IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

更新2

AND listA<>listB AND CHARINDEX(',',listA)=0只要只有一列(=>无逗号),最终你将排除相同的listA和listB