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 / 165429
Accepted
ChrisF
ChrisF
Asked: 2017-02-25 06:21:34 +0800 CST2017-02-25 06:21:34 +0800 CST 2017-02-25 06:21:34 +0800 CST

Como posso gerar mais de 256 caracteres em um arquivo?

  • 772

Estou usando o seguinte comando para gravar a saída de um procedimento armazenado em um arquivo para processamento adicional:

DECLARE @shellCommand VARCHAR(2000)
SET @shellCommand = 'SQLCMD -S ' + @@SERVERNAME + ' -d ' + @dbName + ' -U ' + @UserName + ' -P ' + @Password + ' -Q "' + @sqlCommand + '" -s "," -h -1 -k 1 -W -o "' + @outputfileName + '"'

@sqlCommandestá definido corretamente, como "EXEC StoredProcedureName parameterValue" e quando executado de forma independente aparentemente produz os dados corretos.

O problema que estou tendo é que um dos campos contém texto com mais de 256 caracteres e está sendo truncado quando alimentado por meio do comando SQLCMD.

Ao ler a documentação , vejo que a largura padrão da coluna é de 256 caracteres. Então, estou olhando para usar a opção -you -Ypara permitir que mais de 256 caracteres sejam gerados. No entanto, essas opções não são compatíveis com a -Wopção que eu estava usando para remover espaços à direita da saída. Comecei usando -y 0(apesar do aviso de desempenho - assim que a saída funcionar, posso observar o desempenho). No entanto, isso produz alguns resultados estranhos.

O arquivo consiste em uma linha de cabeçalho seguida pelas linhas de dados e deve se parecer com isto:

First,ABC,Number,String,ReallyLongString,...
A,0123,14.99,"Short string","Longish string",...
B,0456,23.99,"Normal string","Really, really long string that's causing problems",...

Com a -Wopção, o formato do arquivo está correto, mas a string realmente longa é truncada. A razão pela qual descobrimos foi porque o final "estava faltando e o arquivo não estava sendo lido corretamente.

Com -y 0a string realmente longa está obtendo saída, mas um grande número de espaços está sendo adicionado a colunas aparentemente aleatórias. Estamos recebendo algo assim:

First,ABC ,Number    [...]      ,String,ReallyLongString,...
A    ,0123,14.99     [...]      ,"Short string","Longish string",...
B    ,0456,23.99     [...]      ,"Normal string","Really, really long string that's causing problems",...

(Existem muitos, muitos mais espaços entre "Número" e a próxima coluna representada pelo "[...]", estou apenas mostrando alguns).

Existem mais valores numéricos que precisam ser formatados de maneira semelhante e parece que são esses que estão causando os espaços extras após o valor e antes da próxima vírgula. Podemos conviver com alguns espaços extras, mas não tantos, pois o arquivo resultante é muito grande para ser lido pelo programa de destino.

Os dados são gerados por um procedimento armazenado que se parece com isso:

SELECT
    'First' AS First,
    'ABC' AS ABC,
    'Number' AS Number,
    'String' AS String,
    'ReallyLongString' AS ReallyLongString,
    ...

UNION ALL

SELECT
    'A' as First,
    Column1 as ABC,
    REPLACE(FORMAT(Column2, 'N2', 'en-GB'), ',', '') as Number, -- to get the format correct
    '"' + Column3 + '"' as String,
    '"' + Column4 + '"' as ReallyLongString,
    ....
FROM Table
WHERE <condition>

Estou pensando que o problema é a saída do procedimento armazenado. Eu só adicionei a -Wopção ao SQLCMD por causa dos espaços extras à direita sendo gerados, mas olhando para o procedimento armazenado, não consigo descobrir de onde eles estão vindo. Alterei a formatação do número para incluir RTRIM:

RTRIM(REPLACE(FORMAT(Column2, 'N2', 'en-GB'), ',', ''))

mas isso parecia não fazer diferença.

Existe algo que eu possa fazer com o procedimento armazenado ou existe uma combinação de opções para SQLCMD que produzirá a saída desejada? Ou vou ter que encontrar alguma outra forma de produzir esse arquivo?

sql-server csv
  • 3 3 respostas
  • 7454 Views

3 respostas

  • Voted
  1. Best Answer
    ChrisF
    2017-03-08T02:53:08+08:002017-03-08T02:53:08+08:00

    Ao experimentar as várias sugestões nos comentários, encontrei uma solução.

    troquei:

    '"' + Column4 + '"' as ReallyLongString,
    

    com:

    '"' + REPLICATE('O', 4000) + '"' AS ReallyLongString,
    

    e todo o texto foi produzido.

    No entanto, usando uma variável:

    DECLARE @longText NVARCHAR(MAX)
    SET @longText = REPLICATE('O', 4000);
    
    '"' + @longText + '"' AS ReallyLongString,
    

    não.

    O que funcionou foi declarar a variável com um comprimento específico:

    DECLARE @longText NVARCHAR(4000)
    

    Portanto, como o texto neste caso nunca terá mais de 2.000 caracteres (o dispositivo que está lendo o arquivo não pode lidar com texto tão longo), converto todo o texto em strings de 2.000 caracteres:

    SELECT
        'A' as First,
        Column1 as ABC,
        REPLACE(FORMAT(Column2, 'N2', 'en-GB'), ',', '') as Number, -- to get the format correct
        '"' + CAST(Column3 as NVARCHAR(2000)) + '"' as String,
        '"' + CAST(Column4 as NVARCHAR(2000)) + '"' as ReallyLongString,
        ....
    FROM Table
    WHERE <condition>
    

    Este é o como. Ainda não sei bem o porquê.

    • 2
  2. Marco Roy
    2019-03-27T18:03:30+08:002019-03-27T18:03:30+08:00

    Estranho... usar -y 0realmente funciona perfeitamente para mim. Sem preenchimento de espaço em branco ou quaisquer outros problemas de formatação. Na verdade, funciona melhor do que -W, mesmo que a documentação não explique o porquê e ainda recomende o uso de -W:

    -C

    Esta opção remove os espaços à direita de uma coluna. Use esta opção junto com a opção -s ao preparar dados que serão exportados para outro aplicativo. Não pode ser usado com as opções -y ou -Y.

    Embora não esteja documentado, parece que -y 0realmente faz o que -Wanuncia e muito mais (comprimento de string ilimitado e até mesmo remove os cabeçalhos, portanto, não há necessidade de -h-1). A única outra opção que tive que usar foi -s ","especificar um separador de coluna diferente.

    Estou usando a versão 13.1.0007.0no Linux, então talvez o problema do OP seja algo que foi corrigido em versões superiores.

    O único problema que encontrei foi um caractere não imprimível (o que parece uma caixa) sendo adicionado no final de strings muito longas (mais de 100K caracteres), mas quando as strings são citadas ( '"' + field + '"'), o caractere desaparece. ¯\_(ツ)_/¯

    • 1
  3. Code First
    2020-03-06T08:27:33+08:002020-03-06T08:27:33+08:00

    insira a descrição da imagem aqui

    Nas opções do SSMS, altere Resultados da consulta > Resultados para texto > Número máximo de caracteres exibidos em cada coluna:

    • 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

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 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

    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
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • 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
    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

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