O BCP não fornece resultados nem gera nada ao usar instruções válidas, mas gera erros ao transmitir parâmetros inválidos

3

Eu tenho que usar a ferramenta de linha de comando bcp para exportar dados de um banco de dados SQL Server para um arquivo em um servidor Red Hat. Eu estou (aparentemente) usando instruções válidas, mas bcp não está produzindo nenhum tipo de saída / resultados. No entanto, quando executo instruções com parâmetros ausentes ou inválidos, ele exibe o respectivo erro. Eu estou procurando o motivo deste problema (por exemplo, instalação defeituosa, mau uso de bcp , falta de permissões ou qualquer outro conflito conhecido) e como corrigi-lo.

declaração de bcp:

bcp fully_qualified_table_name out ./data.txt -c -S server -U user -P password

uso do bcp:

usage: /opt/microsoft/bin/bcp {dbtable | query} {in | out | queryout | format} datafile
  [-m maxerrors]            [-f formatfile]          [-e errfile]
  [-F firstrow]             [-L lastrow]             [-b batchsize]
  [-n native type]          [-c character type]      [-w wide character type]
  [-N keep non-text native] [-q quoted identifier]
  [-t field terminator]     [-r row terminator]
  [-a packetsize]           [-K application intent]
  [-S server name or DSN if -D provided]             [-D treat -S as DSN]
  [-U username]             [-P password]
  [-T trusted connection]   [-v version]             [-R regional enable]
  [-k keep null values]     [-E keep identity values]
  [-h "load hints"]         [-d database name]

versão do bcp:

BCP - Bulk Copy Program for Microsoft SQL Server.
Copyright (C) Microsoft Corporation. All Rights Reserved.
Version: 11.0.2270.0

Versão do SQL Server ( SELECT @@VERSION ):

Microsoft SQL Server 2012 - 11.0.5058.0 (X64)
   May 14 2014 18:34:29
   Copyright (c) Microsoft Corporation
   Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)

Distribuição:

Red Hat Enterprise Linux 6.7 (KornShell).

Instruções inválidas com a respectiva mensagem de erro (exemplos).

bcp THAT_TUB_ACE.oh_nerd.table_name out ./data.txt -c -S sr._bear -U you_sr. -P pass_sword

    SQLState = S1T00, NativeError = 0
    Error = [unixODBC][Microsoft][ODBC Driver 11 for SQL Server]Login timeout expired
    SQLState = 08001, NativeError = 11001
    Error = [unixODBC][Microsoft][ODBC Driver 11 for SQL Server]A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online.
    SQLState = 08001, NativeError = 11001
    Error = [unixODBC][Microsoft][ODBC Driver 11 for SQL Server]TCP Provider: Error code 0x2AF9

...

bcp fully_qualified_table_name ./data.txt -c -S valid_server -U valid_user -P bad_word

    bcp fully_qualified_table_name out ./data.txt -c -S valid_server -U valid_user -P bad_word
    SQLState = 28000, NativeError = 18456
    Error = [unixODBC][Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Login failed for user 'valid_user'.

SUMMARY.

O objetivo é gerar um arquivo de dados usando a seguinte sintaxe (ou similar):

bcp fully_qualified_table_name out ./data.txt -c -S server -U user -P password

Os fatos são:

  • Ao executar uma instrução bcp válida, não há nada na janela (nenhuma saída) e nenhum arquivo de dados é criado.
  • Não consigo usar a opção -T (conexão confiável usando segurança integrada) para bcp , portanto, preciso especificar o servidor, usuário e senha .
  • Tentei a opção queryout em uma pequena mesa muito simples, mas ainda sem sorte.
  • As credenciais são válidas. Testei-as com sucesso usando sqlcmd da seguinte forma: sqlcmd -S server -U user -P password -Q 'SELECT * FROM really_small_table' .
  • As declarações bcp em "Declarações inválidas com a respectiva mensagem de erro (exemplos)" seção desta pergunta são apenas exemplos de instruções inválidas para mostrar que bcp realmente faz algo, mas dando os resultados esperados.
por CamelCamelius 26.09.2016 / 22:42

1 resposta

1

O que eu encontrei na minha plataforma Debian é que o processo de instalação do Microsoft ODBC colocou libodbc.so em /usr/lib64 . Este não é um local esperado para bibliotecas e bcp não pode encontrá-lo. Mas em vez de dizer que não é possível encontrar uma biblioteca necessária, ela simplesmente sai.

Solução para o Debian. Sua situação deve ser semelhante.

  1. Encontre onde o procedimento de instalação colocou libodbc.so :

    find / -type f -name libodbc.so
    
  2. Adicione seu diretório a um novo arquivo /etc/ld.so.conf.d/odbc.conf . Eu inventei o nome e no meu sistema /etc/ld.so.conf.d está incluído em /etc/ld.so.conf :

    # Required but not documented by MS ODBC installation for SQL Server
    /usr/lib64
    
  3. Execute ldconfig para atualizar a lista de locais de bibliotecas

  4. Repita o comando bcp

Você precisará ser root para executar as etapas 2 e 3. Suponho que não é grande coisa, já que você conseguiu instalar as bibliotecas do SQL Server.

    
por 29.09.2016 / 20:17