Sql-Server
僅選擇具有特定表名和特定列的數據庫
所以我的第一個查詢是這個:
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
USE [?]
您可以使用 TABLE_CATALOG 來過濾您要搜尋的數據庫,而不是使用。在我的範例中,我使用了 LIKE ‘fiddle%’,因為每次執行查詢時它都會發生變化。- 您可以使用 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在這裡