none
utilizando o Powershell em uma proc RRS feed

  • Pergunta

  • Bom dia.

    Preciso de ajuda para criar um comando utilizando o PowerShell em uma procedure que eu criei.

    Vou executar o PowerShell atreves do xp_cmdshell, o problema é que nunca trabalhei com PowerShell, então preciso criar um comando que le um arquivo e se o arquivo  tiver um caracter '.00' tem que trocar para "00.00"

    Obrigada

    Elisangela

    terça-feira, 31 de outubro de 2017 13:10

Respostas

  • Lisli,

    Se a questão é a estrutura da tabela que pode mudar, você pode utilizar o bcp com uma query dinâmica, podendo fazer a conversão para preservar teus valores.

    Veja um exemplo:

    create table TabelaExemplo(Id int identity(1,1), Tipo varchar(10), Valor numeric(9,2))
    
    insert into TabelaExemplo 
    values
    ('Tipo1', 10.00), 
    ('Tipo2', 5.00), 
    ('Tipo3', 6.80), 
    ('Tipo4', 0.00), 
    ('Tipo5', 7.50), 
    ('Tipo6', 0.00)
    
    /*Aqui você pode fazer um loop por todas as tabelas que 
    você tem ou repetir o código na sequência que quiser*/
    
    declare @tabela varchar(MAX) = 'TabelaExemplo'
    
    DECLARE @select VARCHAR(500), @cmd VARCHAR(500), @colunas varchar(MAX)
    
    select @colunas = 
    	stuff((select ',' + case when DATA_TYPE not in ('numeric') 
    	then quotename(COLUMN_NAME) else 'CONVERT(varchar(50), convert(decimal(10,2), ' 
    	+ quotename(COLUMN_NAME) + '))' END
    			from information_schema.columns where table_name = @tabela         
    			for xml path('')), 1, 1, '')
    
    set @select = 'SELECT ' + @colunas + ' FROM ' +  @tabela
    set @cmd= 'BCP "' + @select + '" QUERYOUT  E:\' + @tabela + '.txt' + ' -c -t, -r \n -T'  
    exec master..xp_cmdshell @cmd

    Att,


    Antero Marques
    _______________________________________________________________________________
    Se a resposta for útil, marque como útil, se respondeu totalmente sua dúvida, marque como resposta. O Fórum MSDN é utilizado também como base de conhecimento, então é responsabilidade de todos mantê-lo organizado e funcional.



    quarta-feira, 8 de novembro de 2017 00:37

Todas as Respostas

  • Lisli,

    PowerShell via XP_CMDShell? Sinceramente não vejo isso como uma boa decisão, ainda mais a nível de segurança.

    Você poderia descrever a sua necessidade?


    Pedro Antonio Galvao Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    terça-feira, 31 de outubro de 2017 21:59
  • Bom dia , Complementando a questão do Galvao , 

    1) por que PowerShell ?

    2)   lê um arquivo e se o arquivo  tiver um caracter '.00' tem que trocar para "00.00"

     isso no nome do arquivo ou no seu conteúdo ??

    3)que tipo de arquivo, csv , excel,xml ?

    4) por que isso não pode ser feito na aplicação

    Wesley Neves - Brasilia-DF

     
    https://wesleyneves.wordpress.com/
    MTA-SQL Server
    MTA- Web Development
    Analista Desenvolvedor.NET
    Pós-Graduando em Banco de Dados 
    "Se a resposta for útil ou ajudar ,não esqueça de marcar"





    Wesley Neves

    quarta-feira, 1 de novembro de 2017 10:56
  • Wesley e Galvao

    Eu sei que o xp_cmdshell não é muito utilizado por problema de segurança, porém ja está habilitado por causas de outros processos que estamos utilizando.

    Não tem como fazer isso na aplicaçao porque não existe aplicação, é uma procedure que eu executo que gera arquivos através do bcp out.

    O arquivo é um txt e tenho que alterar o conteúdo que está nesse arquivo.

    Pensei no powershell porque foi a unica forma que achei para resolver esse problema.

    Obrigada


    • Editado Lisli terça-feira, 7 de novembro de 2017 16:57
    terça-feira, 7 de novembro de 2017 16:57
  • Lisli,

    Dependendo da versao do SQL Server que voce esteja utilizando, voce poderia criar um JOB onde o step pode ser executado scripts do Powershell. A documentacao consegue te ajudar com isso.

    https://technet.microsoft.com/en-us/library/cc280490%28v=sql.110%29.aspx?f=255&MSPPError=-2147217396

    https://www.sqlhammer.com/running-powershell-in-a-sql-agent-job/

    Utilizando esse processo, voce introduz menos problemas de seguranca no seu ambiente. 

    Outro detalhe a mencionar eh o resultado final que voce esta tentando alcancar. Mesmo com o BCP out, dependendo de como voce estiver executando, o arquivo de saida pode ficar com o nome que voce desejar.

    Quem sabe explicando melhor o seu cenario fica mais facil de ajudar.


    Att,<br/> Marcos Freccia [MVP em SQL Server]<br/> <a href="http://marcosfreccia.wordpress.com">Blog</a>|<a href="http://twitter.com/sqlfreccia">Twitter</a> <br/> Assine também os feeds clicando <a href="http://marcosfreccia.wordpress.com/feed/"> aqui</a>

    terça-feira, 7 de novembro de 2017 17:54
  • Meu cenário é bem simples. Fiz uma procedure que executa o comando bcp out de algumas tabelas. Esse bcp out gera uns arquivos .txt.

    O problema é o seguinte, tenho algumas tabelas que o campo é do tipo numeric com o contetudo 0.00, quando executo a minha procedure ele gera os arquivos porém, nos campos que tem 0.00 no arquivo txt fica .00.

    Pensei em criar uma view e converter esses campos, porém o cliente não quer que utilize a view, por causa de possiveis alteraçoes na tabela e etc...

    Por isso tenho que arrumar o conteúdo do arquivo onde tem .00 tem que ficar 0.00 conforme está na tabela.

    terça-feira, 7 de novembro de 2017 18:13
  • Deleted
    terça-feira, 7 de novembro de 2017 23:01
  • Lisli,

    Se a questão é a estrutura da tabela que pode mudar, você pode utilizar o bcp com uma query dinâmica, podendo fazer a conversão para preservar teus valores.

    Veja um exemplo:

    create table TabelaExemplo(Id int identity(1,1), Tipo varchar(10), Valor numeric(9,2))
    
    insert into TabelaExemplo 
    values
    ('Tipo1', 10.00), 
    ('Tipo2', 5.00), 
    ('Tipo3', 6.80), 
    ('Tipo4', 0.00), 
    ('Tipo5', 7.50), 
    ('Tipo6', 0.00)
    
    /*Aqui você pode fazer um loop por todas as tabelas que 
    você tem ou repetir o código na sequência que quiser*/
    
    declare @tabela varchar(MAX) = 'TabelaExemplo'
    
    DECLARE @select VARCHAR(500), @cmd VARCHAR(500), @colunas varchar(MAX)
    
    select @colunas = 
    	stuff((select ',' + case when DATA_TYPE not in ('numeric') 
    	then quotename(COLUMN_NAME) else 'CONVERT(varchar(50), convert(decimal(10,2), ' 
    	+ quotename(COLUMN_NAME) + '))' END
    			from information_schema.columns where table_name = @tabela         
    			for xml path('')), 1, 1, '')
    
    set @select = 'SELECT ' + @colunas + ' FROM ' +  @tabela
    set @cmd= 'BCP "' + @select + '" QUERYOUT  E:\' + @tabela + '.txt' + ' -c -t, -r \n -T'  
    exec master..xp_cmdshell @cmd

    Att,


    Antero Marques
    _______________________________________________________________________________
    Se a resposta for útil, marque como útil, se respondeu totalmente sua dúvida, marque como resposta. O Fórum MSDN é utilizado também como base de conhecimento, então é responsabilidade de todos mantê-lo organizado e funcional.



    quarta-feira, 8 de novembro de 2017 00:37
  • Antero...

    Já estava trabalhando com SQL dinâmico só não sabia como tratar o campo. Sua dica foi muito útil. Fiz e funcionou super!

    Muito obrigada



    • Editado Lisli quarta-feira, 8 de novembro de 2017 17:00
    quarta-feira, 8 de novembro de 2017 16:58