Estou exportando uma tabela para um arquivo TSV usando sqlcmd e estou tendo problemas. A tabela tem mais de 16 milhões de linhas e cerca de 55 colunas.
O problema é que ele não exporta a tabela completa, mas parece parar aleatoriamente em vários pontos (suponho que seja um tempo limite?) Cada vez que um número diferente de linhas é exportado e cada vez que o arquivo tem um tamanho ligeiramente diferente (indicando que não estou atingindo nenhum limite de linha ou tamanho).
Não estou usando nenhuma chave de tempo limite (o que significa que o padrão "o tempo que for necessário" é usado).
Aqui está o meu comando (com a maioria das colunas removidas para fins de simplificação e ilustração):
sqlcmd -U myUsername -P myPassword -S SERVERNAME -d "DBNAME" -Q "SELECT ROW_KEY, ISNULL(CARRIER_ID, ''),ISNULL(CONVERT(VARCHAR(19),ORDER_DATETIME,120),''),ISNULL(HEIGHT, ''),ISNULL(RESIDENTIAL_CHARGE, '') FROM MYTABLE" -o "OUTPUT_FILE.txt" -h-1 -s"|" -W
Gostaria de saber se poderia ter algo a ver com tempos limite ou o uso de ISNULL () em todas as colunas (embora quando executo a consulta no sql server management studio recebo o número correto de linhas retornadas, por exemplo, 16 milhões +)?
Mais uma vez, recebo cerca de 4 a 8 milhões de linhas de cada vez, mas nunca o valor total. Estou em um sql server 2k5 db e executando o sqlcmd de uma máquina remota com sql server 2k8.
Você provavelmente desejará fazer isso com o bcp, que é destinado a esse tipo de coisa. Seria algo assim:
Substitua -c por -w se estiver lidando com nvarchar/nchar e desejar saída Unicode.
Pode considerar o uso do Invoke-Sqlcmd, pois você está trabalhando em uma máquina com o SQL 2008 instalado. Você não obtém a
-s
opção de separador de colunasqlcmd
, mas dentro do PowerShell você pode exportá-lo para XML ou CSV.A sintaxe básica para sua consulta seria:
Então, se você absolutamente precisasse manter um separador específico entre as colunas, basta modificar um pouco sua consulta:
O que @db2 disse. Se isso não funcionar, tente segmentar seus dados. Se você tiver um campo de ID inteiro, poderá adicionar
Faça um loop para todos os valores de @SegmentNumber de zero a um a menos que o número de segmentos e você deve obter todos os registros. A implementação do módulo do Microsoft SQL retorna apenas números positivos, ao contrário de alguns ( https://stackoverflow.com/questions/4412179/best-way-to-make-javas-modulus-behave-like-it-should-with-negative-numbers /4412200#4412200 ) idiomas.