none
T-SQL Complexo RRS feed

  • Pergunta

  • Bom dia pessoas...

    Estou com uma dúvida tremenda... a situação é a seguinte.. tenho uma tabela com 2 mil maquinas cadastradas... e gostaria de gerar um arquivo "txt" com ela formatada e numerada! Não preciso de um sql que crie um arquivo.. posso simplesmente copiar e colar o resultado.. mas preciso ter esse arquivo com dados da tabela.

    Tenho a segunda consulta

    select ip, nome_maquina, local from maquina

    preciso que isso fique da seguinte forma:

    1_ip_10.10.10.1

    1_nome_MaquinaFaturamento

    1_local_Compinas

    2_ip_10.10.10.2

    2_nome_MaquinaEstoque

    2_local_Compinas

    3_ip_10.10.10.3

    3_nome_MaquinaCliente

    3_local_Jundiai

    Compreenderam?

    Eu tentei algo assim, mas não estou tendo sucesso... alguém poderia me dizer como fazer?

    DECLARE @i INT
    SET @i = 1

    WHILE (@i < 10)
    BEGIN
            
            print(CONVERT(@i) + '_ip_'+select ip from maquina where id_maquina = @i);
            print(CONVERT(@i) + '_nome_'+select nomeMaquina from maquina where id_maquina = @i);
            print(CONVERT(@i) + '_local_'+select local from maquina where id_maquina = @i);
        SET @i = @i + 1
    END

    quinta-feira, 27 de junho de 2013 12:31

Respostas

  • Leandro,

    Segue abaixo uma possibilidade de implementação.

    --Tabela com dados originais para teste
    DECLARE @t1 TABLE
    (
    	ip				VARCHAR(100),
    	nome_maquina	VARCHAR(100),
    	[local]			VARCHAR(100)
    )
    
    INSERT INTO @t1(ip, nome_maquina, [local]) VALUES
    ('10.10.10.1', 'Mqn1', 'São Paulo'),
    ('10.10.10.2', 'Mqn2', 'Campinas'),
    ('10.10.10.3', 'Mqn3', 'Rio de Janeiro')
    
    --Processamento, a partir daqui é seu select
    DECLARE @maquinas TABLE
    (
    	ip				VARCHAR(100),
    	nome_maquina	VARCHAR(100),
    	[local]			VARCHAR(100),
    	stat			BIT DEFAULT 0
    )
    INSERT INTO @maquinas(ip, nome_maquina, [local], stat)
    SELECT ip, nome_maquina, [local], 0
    FROM @t1
    
    DECLARE @Final TABLE
    (
    	Campo VARCHAR(100)
    )
    
    DECLARE @maquina VARCHAR(100)
    SET @maquina = ''
    
    DECLARE @cont INT
    SET @cont = 1
    
    DECLARE @valor VARCHAR(100)
    SET @valor = ''
    
    WHILE(EXISTS(SELECT TOP 1 1 FROM @maquinas WHERE stat = 0))
    BEGIN
    	SELECT TOP 1
    		@maquina = ip
    	FROM @maquinas
    	WHERE
    		stat = 0
    	
    	SELECT @valor = ip FROM @maquinas WHERE ip = @maquina
    	INSERT INTO @Final(Campo) VALUES (CAST(@cont AS VARCHAR(100)) + '_' + @valor)
    	
    	SELECT @valor = nome_maquina FROM @maquinas WHERE ip = @maquina
    	INSERT INTO @Final(Campo) VALUES (CAST(@cont AS VARCHAR(100)) + '_' + @valor)
    	
    	SELECT @valor = [local] FROM @maquinas WHERE ip = @maquina
    	INSERT INTO @Final(Campo) VALUES (CAST(@cont AS VARCHAR(100)) + '_' + @valor)
    		
    	UPDATE @maquinas
    	SET stat = 1
    	WHERE ip = @maquina
    	
    	SET @cont = @cont + 1
    END
    
    SELECT *
    FROM @Final


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Email: fabrizzio.antoniaci@gmail.com

    quinta-feira, 27 de junho de 2013 12:40
    Moderador
  • select ROW_NUMBER() over (order by ip) as numeracao, ip, nome_maquina, local into #maquinasexp from maquina
    select cast(numeracao as varchar) + '_ip_' + ip from #maquinasexp
    union
    select cast(numeracao as varchar) + '_nome_' + nome_maquina from #maquinasexp
    union
    select cast(numeracao as varchar) + '_local_' + local from #maquinasexp

    Só uma alternativa !!

    Até mais...


    Antero Marques

    quinta-feira, 27 de junho de 2013 16:19

Todas as Respostas

  • Leandro,

    Segue abaixo uma possibilidade de implementação.

    --Tabela com dados originais para teste
    DECLARE @t1 TABLE
    (
    	ip				VARCHAR(100),
    	nome_maquina	VARCHAR(100),
    	[local]			VARCHAR(100)
    )
    
    INSERT INTO @t1(ip, nome_maquina, [local]) VALUES
    ('10.10.10.1', 'Mqn1', 'São Paulo'),
    ('10.10.10.2', 'Mqn2', 'Campinas'),
    ('10.10.10.3', 'Mqn3', 'Rio de Janeiro')
    
    --Processamento, a partir daqui é seu select
    DECLARE @maquinas TABLE
    (
    	ip				VARCHAR(100),
    	nome_maquina	VARCHAR(100),
    	[local]			VARCHAR(100),
    	stat			BIT DEFAULT 0
    )
    INSERT INTO @maquinas(ip, nome_maquina, [local], stat)
    SELECT ip, nome_maquina, [local], 0
    FROM @t1
    
    DECLARE @Final TABLE
    (
    	Campo VARCHAR(100)
    )
    
    DECLARE @maquina VARCHAR(100)
    SET @maquina = ''
    
    DECLARE @cont INT
    SET @cont = 1
    
    DECLARE @valor VARCHAR(100)
    SET @valor = ''
    
    WHILE(EXISTS(SELECT TOP 1 1 FROM @maquinas WHERE stat = 0))
    BEGIN
    	SELECT TOP 1
    		@maquina = ip
    	FROM @maquinas
    	WHERE
    		stat = 0
    	
    	SELECT @valor = ip FROM @maquinas WHERE ip = @maquina
    	INSERT INTO @Final(Campo) VALUES (CAST(@cont AS VARCHAR(100)) + '_' + @valor)
    	
    	SELECT @valor = nome_maquina FROM @maquinas WHERE ip = @maquina
    	INSERT INTO @Final(Campo) VALUES (CAST(@cont AS VARCHAR(100)) + '_' + @valor)
    	
    	SELECT @valor = [local] FROM @maquinas WHERE ip = @maquina
    	INSERT INTO @Final(Campo) VALUES (CAST(@cont AS VARCHAR(100)) + '_' + @valor)
    		
    	UPDATE @maquinas
    	SET stat = 1
    	WHERE ip = @maquina
    	
    	SET @cont = @cont + 1
    END
    
    SELECT *
    FROM @Final


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Email: fabrizzio.antoniaci@gmail.com

    quinta-feira, 27 de junho de 2013 12:40
    Moderador
  • Bom dia,

    Leandro, acho que você também pode tentar utilizar Unpivot mais ou menos como segue:

    select CAST(rn as varchar) + '_' + coluna + '_' + valor
    from 
        (select [ip], [nomeMaquina], [local], ROW_NUMBER() OVER(ORDER BY [ip]) as RN
         from maquina) as t
    unpivot
        (valor for coluna in ([ip], [nomeMaquina], [local])
        ) as u 
    

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Sugerido como Resposta Antero Marques quinta-feira, 27 de junho de 2013 17:13
    quinta-feira, 27 de junho de 2013 12:57
  • Obrigado Fabrizzio... perfeito!

    Obrigado gapimex.. mas não consegui fazer funcionar como esta

    quinta-feira, 27 de junho de 2013 15:23
  • select ROW_NUMBER() over (order by ip) as numeracao, ip, nome_maquina, local into #maquinasexp from maquina
    select cast(numeracao as varchar) + '_ip_' + ip from #maquinasexp
    union
    select cast(numeracao as varchar) + '_nome_' + nome_maquina from #maquinasexp
    union
    select cast(numeracao as varchar) + '_local_' + local from #maquinasexp

    Só uma alternativa !!

    Até mais...


    Antero Marques

    quinta-feira, 27 de junho de 2013 16:19
  • Leandro,

    Só por curiosidade, qual versão do SQL Server você está utilizando?

    Ocorria algum erro ao executar a query que sugeri? Qual mensagem era exibida?


    Assinatura: http://www.imoveisemexposicao.com.br

    quinta-feira, 27 de junho de 2013 17:11
  • Boa tarde Gabimex...


    Deu o seguinte erro:

    Mensagem 8167, Nível 16, Estado 1, Linha 6
    O tipo de coluna "nomeMaquina" está em conflito com o tipo de outras colunas especificadas na lista UNPIVOT.

    Uso SQL Server 2012


    Abraço

    segunda-feira, 1 de julho de 2013 19:51
  • Antero... muito bom... mas o ROW_NUMBER() ficou estranho... e além do mais eu preciso de uma ordem....

    O resultado real ficou assim:

    701_ip_10.103.130.77
    936_ip_10.104.109.24
    1520_ip_10.110.4.76
    1666_ip_10.49.26.192
    1757_ip_10.56.14.132
    136_nome_T654_400012
    1537_local_DRE IPIRANGA
    1639_local_GABINETE SECRET SME-G
    1700_local_DRE PENHA
    1200_nome_X656_99015
    1439_nome_C782_108500 - 71
    1516_nome_X656_108400 - 72
    1627_nome_X656_120006 - 149
    1774_nome_X656_019262

    segunda-feira, 1 de julho de 2013 19:59
  • Boa tarde,

    Leandro, qual é o tipo (e tamanho se for o caso) das colunas ip, nome_maquina e local?


    Assinatura: http://www.imoveisemexposicao.com.br

    segunda-feira, 1 de julho de 2013 20:08
  • Nesse caso, é só ordenar.

    select ROW_NUMBER() over (order by ip) as numeracao, ip, nome_maquina, local into #maquinasexp from maquina
    select cast(numeracao as varchar) + '_ip_' + ip linha from #maquinasexp
    union
    select cast(numeracao as varchar) + '_nome_' + nome_maquina linha from #maquinasexp
    union
    select cast(numeracao as varchar) + '_local_' + local linha from #maquinasexp
    order by linha

    Esta é uma alternativa porque dissestes que deu erro o unpivot, mas é o caminho mais coreto e elegante.

    Até mais !


    Antero Marques


    • Editado Antero Marques terça-feira, 2 de julho de 2013 00:45 Complemento
    terça-feira, 2 de julho de 2013 00:28