/***************************************************************************************************|
| Procedure:          [SP_CRIAR_LISTA_TABELAS]                                                      |
| Data de Criação:    2024-02-23                                                                    |
| Autor:              Raphael Coelho                                                                |
|                                                                                                   |
| Objetivo:           Obtém uma lista de todas as tabelas físicas presentes no banco de dados       |
|                     atual, disponibilizando essas informações em uma tabela temporária global.    |
|                     Utiliza a stored procedure 'sp_msforeachdb', que itera por todos os bancos    |
|                     disponíveis no servidor conectado, incluindo o nome do servidor, banco,       |
|                     esquema e tabela.                                                             |
|                                                                                                   |
| Utilização:         EXEC [SP_CRIAR_LISTA_TABELAS]                                                 |
|                     SELECT * FROM ##LISTA_TABELAS                                                 |
***************************************************************************************************/

CREATE PROCEDURE [SP_CRIAR_LISTA_TABELAS]
AS
BEGIN
    /* ETAPA 1: RETORNA TODAS AS TABELAS DO BANCO */
    -- Desativa a contagem de linhas afetadas no painel de resultados
    SET NOCOUNT ON;

    -- Declara uma tabela de variáveis para armazenar o caminho das tabelas
    DECLARE @LISTA_TABELAS TABLE (CAMINHO_COMPLETO NVARCHAR(4000) COLLATE DATABASE_DEFAULT);
    
    -- Insere os caminhos das tabelas na tabela de variáveis usando a stored procedure 'sp_msforeachdb'
    INSERT INTO @LISTA_TABELAS (CAMINHO_COMPLETO)
    EXEC sp_msforeachdb 'SELECT @@SERVERNAME + ''.'' + ''?'' + ''.'' + B.name + ''.'' + A.name COLLATE DATABASE_DEFAULT
                           FROM [?].sys.tables AS A
                          INNER JOIN sys.schemas AS B
                             ON A.schema_id = B.schema_id';
        
    /* ETAPA 2: GERA A TABELA FINAL */
    -- Verifica se a tabela temporária já existe e, se sim, a remove
    IF OBJECT_ID('tempdb..##LISTA_TABELAS') <> 0
        DROP TABLE ##LISTA_TABELAS;

    -- Cria a tabela final com os dados das tabelas encontradas e as ordena por banco
    SELECT SUBSTRING(CAMINHO_COMPLETO, 1, CHARINDEX('.', CAMINHO_COMPLETO) - 1) AS NOME_SERVIDOR,
           SUBSTRING(CAMINHO_COMPLETO, CHARINDEX('.', CAMINHO_COMPLETO) + 1, 
                     CHARINDEX('.', CAMINHO_COMPLETO, CHARINDEX('.', CAMINHO_COMPLETO) + 1) - CHARINDEX('.', CAMINHO_COMPLETO) - 1) AS NOME_BANCO,
           SUBSTRING(CAMINHO_COMPLETO, CHARINDEX('.', CAMINHO_COMPLETO, CHARINDEX('.', CAMINHO_COMPLETO) + 1) + 1, 
                     CHARINDEX('.', CAMINHO_COMPLETO, CHARINDEX('.', CAMINHO_COMPLETO, CHARINDEX('.', CAMINHO_COMPLETO) + 1) + 1) - 
                     CHARINDEX('.', CAMINHO_COMPLETO, CHARINDEX('.', CAMINHO_COMPLETO) + 1) - 1) AS NOME_SCHEMA,
           SUBSTRING(CAMINHO_COMPLETO, CHARINDEX('.', CAMINHO_COMPLETO, CHARINDEX('.', CAMINHO_COMPLETO, CHARINDEX('.', CAMINHO_COMPLETO) + 1) + 1) + 1, 
                     LEN(CAMINHO_COMPLETO)) AS NOME_TABELA
      INTO ##LISTA_TABELAS
      FROM @LISTA_TABELAS
     WHERE CAMINHO_COMPLETO NOT LIKE '%tempdb%'
     ORDER BY 1, 2, 3, 4;

    -- Ativa novamente a contagem de linhas afetadas no painel de resultados
    SET NOCOUNT OFF;

    -- Mensagem de retorno
    PRINT('');
    PRINT('EXECUTE A CONSULTA ABAIXO PARA UTILIZAR A TABELA CRIADA.');
    PRINT('');
    PRINT('SELECT * FROM ##LISTA_TABELAS');
    PRINT('_______________________________________________________');
END;
GO
