Sql-Server

僅選擇具有特定表名和特定列的數據庫

  • July 13, 2017

所以我的第一個查詢是這個:

SELECT * 
FROM information_schema.columns 
WHERE table_name='logsys' and 
column_name in
('CD_LOG'
,'NM_USUARIO'
,'DT_ACAO'
,'DS_HISTORICO'
,'NOME_MAQUINA'
,'USUARIO_MAQUINA'
,'DATA_REFERENCIA'
,'ID_SISTEMA'
,'VERSAO'
,'LOCAL'
,'ACAO'
,'ID_LOG'
)

然後在所有數據庫中執行它,我做了這個:

DECLARE @command varchar(1000) 
SELECT @command = 

  'use [?] SELECT 
  DB_NAME() as DatabaseName, * 
FROM information_schema.columns 
WHERE table_name=''logsys'' and  column_name in
(''CD_LOG'',''NM_USUARIO'',''DT_ACAO'',''DS_HISTORICO'',''NOME_MAQUINA'',''USUARIO_MAQUINA'',''DATA_REFERENCIA''
,''ID_SISTEMA'',''VERSAO'',''LOCAL'',''ACAO'',''ID_LOG'')'

EXEC sp_MSforeachdb @command 

但我只是對某事感到困惑。我想要這些特定的列。我想要包含所有這些列的表格。不多也不少。但是in,顯然它列出了至少具有這些列之一的標籤。我對這個簡單的查詢感到困惑。如何在所有數據庫中使用它來僅查找具有所有這些列的表?

我應該使用and column = x, and column= y....等嗎?

還有一個額外的問題。如何foreachdb在表格內插入?

編輯1:

感謝您的回答,現在,我有這個:

--CRIA TABELA DO INSERT 
CREATE TABLE TB_DB_LOGSYS
   (
       DATABASENAME VARCHAR(200),
       TABLE_CATALOG VARCHAR(200),
       TABLE_NAME VARCHAR(200),
       COLUMN_NAME VARCHAR(200),
       DATA_TYPE VARCHAR(100)
   )
GO
---------------------------------------------------------------------------
--PROCURA AS LOGSYS QUE POSSUEM 12 COLUNAS 
TRUNCATE TABLE TB_DB_LOGSYS
DECLARE @command varchar(1000) 
SELECT @command = 

  'use [?] SELECT 
  DB_NAME() as DatabaseName,  TABLE_CATALOG, TABLE_NAME, COLUMN_NAME, DATA_TYPE
FROM information_schema.columns 
WHERE table_name=''logsys'' and  column_name in
(''CD_LOG'',''NM_USUARIO'',''DT_ACAO'',''DS_HISTORICO'',''NOME_MAQUINA'',''USUARIO_MAQUINA'',''DATA_REFERENCIA''
,''ID_SISTEMA'',''VERSAO'',''LOCAL'',''ACAO'',''ID_LOG'')'

--INSERE O FOREACHDB NA TABELA
INSERT INTO TB_DB_LOGSYS
EXEC sp_MSforeachdb @command 
---------------------------------------------------------------------------
SELECT * FROM TB_DB_LOGSYS

SELECT DATABASENAME, COUNT(COLUMN_NAME) AS [COUNT] FROM TB_DB_LOGSYS
GROUP BY DATABASENAME
HAVING COUNT(COLUMN_NAME)=12

但使用having並不是我真正想要的。也許還有另一列,而不是我要找的。

我在 fiddle.uk 上設置了這個範例,只是為了向您展示一個選項。

CREATE TABLE logsys_a(id int, v1 int, v2 int, v3 int, v4 int, v5 int);
CREATE TABLE logsys_b(id int, v1 int, v2 int,         v4 int, v5 int);
CREATE TABLE logsys_c(id int, v1 int, v2 int, v3 int, v4 int, v5 int);
GO
  1. USE [?]您可以使用 TABLE_CATALOG 來過濾您要搜尋的數據庫,而不是使用。在我的範例中,我使用了 LIKE ‘fiddle%’,因為每次執行查詢時它都會發生變化。
  2. 您可以使用 HAVING COUNT() = x 檢查是否EXISTS包含所有必需列的表,如您所見,在這種情況下它只返回 logsys_a 和 logsys_b。

據我所知,您是否需要我COLUMN_NAME IN ('v1','v2','v3','v4','v5')在主查詢中沒有再次使用過的所有表列。

SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME
FROM   INFORMATION_SCHEMA.COLUMNS T1 
WHERE  TABLE_CATALOG LIKE 'fiddle%'
AND    TABLE_NAME LIKE '%logsys%'
AND    EXISTS (SELECT   T2.TABLE_SCHEMA, T1.TABLE_NAME
               FROM     INFORMATION_SCHEMA.COLUMNS T2
               WHERE    TABLE_CATALOG LIKE 'fiddle%'
               AND      T2.TABLE_SCHEMA = T1.TABLE_SCHEMA
               AND      T2.TABLE_NAME = T1.TABLE_NAME
               AND      T2.COLUMN_NAME IN ('v1','v2','v3','v4','v5')
               GROUP BY T2.TABLE_SCHEMA, T2.TABLE_NAME
               HAVING COUNT(*) = 5);

GO
表目錄 | 表模式 | 表名 | COLUMN_NAME
:-------------------------------------- | :----------- | :--------- | :----------
fiddle_a763285347ec46bb9b7fe95d5a6e754b | 德博 | 日誌系統_a | ID 
fiddle_a763285347ec46bb9b7fe95d5a6e754b | 德博 | 日誌系統_a | v1 
fiddle_a763285347ec46bb9b7fe95d5a6e754b | 德博 | 日誌系統_a | v2 
fiddle_a763285347ec46bb9b7fe95d5a6e754b | 德博 | 日誌系統_a | v3 
fiddle_a763285347ec46bb9b7fe95d5a6e754b | 德博 | 日誌系統_a | v4 
fiddle_a763285347ec46bb9b7fe95d5a6e754b | 德博 | 日誌系統_a | v5 
fiddle_a763285347ec46bb9b7fe95d5a6e754b | 德博 | 日誌系統_c | ID 
fiddle_a763285347ec46bb9b7fe95d5a6e754b | 德博 | 日誌系統_c | v1 
fiddle_a763285347ec46bb9b7fe95d5a6e754b | 德博 | 日誌系統_c | v2 
fiddle_a763285347ec46bb9b7fe95d5a6e754b | 德博 | 日誌系統_c | v3 
fiddle_a763285347ec46bb9b7fe95d5a6e754b | 德博 | 日誌系統_c | v4 
fiddle_a763285347ec46bb9b7fe95d5a6e754b | 德博 | 日誌系統_c | v5 

dbfiddle在這裡

引用自:https://dba.stackexchange.com/questions/179756