AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 12739
Accepted
Just a learner
Just a learner
Asked: 2012-02-14 00:10:42 +0800 CST2012-02-14 00:10:42 +0800 CST 2012-02-14 00:10:42 +0800 CST

Qual é a maneira mais fácil de criar uma tabela temporária no SQL Server que pode conter o resultado de um procedimento armazenado?

  • 772

Muitas vezes preciso escrever algo como o seguinte ao lidar com o SQL Server.

create table #table_name
(
    column1 int,
    column2 varchar(200)
    ...
)

insert into #table_name
execute some_stored_procedure;

Mas criar uma tabela que tenha a sintaxe exata como resultado de um procedimento armazenado é uma tarefa tediosa. Por exemplo, o resultado de sp_helppublication tem 48 colunas! Gostaria de saber se existe alguma maneira fácil de fazer isso.

Obrigado.

sql-server t-sql
  • 4 4 respostas
  • 289674 Views

4 respostas

  • Voted
  1. Best Answer
    Martin Smith
    2012-02-14T01:29:55+08:002012-02-14T01:29:55+08:00

    Se o procedimento retornar apenas um conjunto de resultados e a opção de consultas distribuídas ad hoc estiver habilitada.

    SELECT * 
    INTO #T 
    FROM OPENROWSET('SQLNCLI', 
                    'Server=(local)\MSSQL2008;Trusted_Connection=yes;',
                     'SET FMTONLY OFF;EXEC sp_who')
    

    Ou você pode configurar um servidor vinculado de loopback e usá-lo.

    EXEC sp_addlinkedserver @server = 'LOCALSERVER',  @srvproduct = '',
                            @provider = 'SQLNCLI', @datasrc = @@servername
    
    SELECT *
    INTO  #T
    FROM OPENQUERY(LOCALSERVER, 
                   'SET FMTONLY OFF;
                   EXEC sp_who')
    
    • 40
  2. Aaron Bertrand
    2012-02-14T10:04:13+08:002012-02-14T10:04:13+08:00

    No SQL Server 2012 e superior, você pode usar sys.dm_exec_describe_first_result_setlocalmente, supondo que o conjunto de resultados desejado seja o primeiro resultado:

    DECLARE @sql NVARCHAR(MAX) = N'';
    
    SELECT @sql += ',' + CHAR(13) + CHAR(10) + CHAR(9)
        + name + ' ' + system_type_name
        FROM sys.dm_exec_describe_first_result_set('sp_who', NULL, 1);
    
    SELECT @sql = N'CREATE TABLE #f
    (' + STUFF(@sql, 1, 1, N'') + '
    );';
    
    PRINT @sql;
    

    Resultado:

    CREATE TABLE #f
    (
        spid smallint,
        ecid smallint,
        status nchar(30),
        loginame nvarchar(128),
        hostname nchar(128),
        blk char(5),
        dbname nvarchar(128),
        cmd nchar(16),
        request_id int
    );
    

    Observe que há uma limitação: se o procedimento armazenado criar tabelas #temp, a funcionalidade de metadados não funcionará. É por isso que eu não usei sp_who2. :-)

    • 21
  3. gbn
    2012-02-14T00:33:27+08:002012-02-14T00:33:27+08:00

    Não. O resultado de um procedimento armazenado pode variar muito: ele não foi projetado para sempre retornar exatamente um conjunto de resultados como um SELECT em algum objeto.

    Você tem que executar CREATE TABLE

    • 2
  4. WonderWorker
    2015-08-05T05:47:05+08:002015-08-05T05:47:05+08:00

    Eu escreveria um procedimento para gerar a tabela para mim:

    CREATE PROCEDURE [dbo].[p_create_table_from_procedure]
        @TABLE_NAME AS NVARCHAR(MAX),
        @PROCEDURE_NAME AS NVARCHAR(MAX)
    
    As
        DECLARE @CREATE_TABLE_QUERY NVARCHAR(MAX) = N'';
    
    
        SELECT 
            @CREATE_TABLE_QUERY += ', ' + name + ' ' + UPPER(system_type_name) + CHAR(13) + CHAR(10) + CHAR(9)
    
        FROM 
            sys.dm_exec_describe_first_result_set(@procedure_name, NULL, 1);
    
    
        SELECT 
            @CREATE_TABLE_QUERY = N'CREATE TABLE ' + @table_name + '(' + CHAR(13) + CHAR(10) + CHAR(9) + STUFF(@CREATE_TABLE_QUERY, 1, 1, N'') + ');';
    
        PRINT @CREATE_TABLE_QUERY;
    

    Então chame com:

    EXEC p_create_table_from_procedure 'YOUR_TABLE_NAME_HERE', 'YOUR_PROCEDURE_NAME_HERE'
    

    Observação : substitua 'YOUR_PROCEDURE_NAME_HERE' pelo nome de seu próprio procedimento armazenado.

    Nota : Substitua YOUR_TABLE_NAME_HERE pelo nome da tabela de sua escolha.

    O acima irá gerar algo assim:

    CREATE TABLE YOUR_TABLE_NAME_HERE(
         WeekName VARCHAR(40)
        , Line Name VARCHAR(50)
        , TheDate DATETIME
        , ReceivedAll INT
        , Answered INT
        , Abandoned INT
        , Call Length INT
        , WaitTimeAnswer INT
        , WaitTimeAbandon INT
        , PeriodName VARCHAR(10)
        , Week SMALLINT
        , Period SMALLINT
        , Year SMALLINT
        , WeekInPeriod SMALLINT
        , NumWeeksInPeriod SMALLINT
        , WeekendDate DATETIME
        , CRCOperative VARCHAR(100)
        , CallType VARCHAR(20)
        , Charge Time INT
        , SourceNumber VARCHAR(80)
        , DestinationNumber VARCHAR(80)
        , CallStart DATETIME
        , Out of Hours VARCHAR(12)
        , IsWorkingDay BIT
        );
    
    • 0

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve