Trabalho com SQL Server desde o SQL Server 7. Portanto, conheço BCP, Bulk insert, openrowset e SSIS.
Minha dúvida é simples:
- Você conhece outras maneiras de importar/exportar dados usando as versões do SQL Server Express SQL 2005 a 2014 (e em breve 2016).
Quero ter a certeza que não há mais nada pelo facto de a utilização do BCP (que é o que estou a utilizar neste momento) requer a utilização de xp_cmdshell
e por questões de segurança, requer uma xp_cmdshell_proxy
conta. Estou sendo desafiado no trabalho e quero ter certeza de que não existe mais nada ou que seja novo no Microsoft SQL Server (Express) antes de responder.
O SQLCMD pode ser usado para exportar dados. A saída padrão às vezes é complicada para isso, mas você pode usar algumas opções de linha de comando para desativar os cabeçalhos, cortar os espaços à direita e usar uma vírgula em vez do espaço padrão:
Retorna:
Use a
-o
opção de enviar a saída para um arquivo:Um programa .NET personalizado (aplicativo de console, aplicativo do Windows ou até mesmo aplicativo da Web) pode ser criado para importar e/ou exportar. Para importar, como os parâmetros com valor de tabela (TVPs) não são uma opção aqui, às vezes é mais rápido transformar/serializar os dados em XML e, em seguida, executar um procedimento armazenado que aceitará o parâmetro XML e, usando a
.nodes()
função, desserializá-lo de volta em linhas que podem ser inseridas por meio daINSERT INTO table (fields) SELECT x.value(),... FROM @XmlParam.nodes();
construção. Obviamente, você não gostaria de fazer 1 milhão de linhas dessa maneira, portanto, dividiria o arquivo de importação em lotes de X linhas e enviaria de 100 a 500 por vez. Se houver muitos dados, talvez asINSERT
instruções diretas sejam melhores, mas, nesse caso, você deseja agrupar cada lote de X linhas em uma transação explícita usando SqlTransaction .Dependendo de quão confortável você (ou alguém com quem você trabalha) está com a programação .NET, você pode usar o SQLCLR para criar sua própria funcionalidade personalizada de importação e/ou exportação. Isso funcionaria em todas as edições do SQL Server em todas as versões a partir do SQL Server 2005.
Nesse sentido, existe uma biblioteca comercialmente disponível de funções e procedimentos SQLCLR chamada SQL# (da qual sou o criador). Algumas das funções e procedimentos armazenados lidam com a importação e exportação de dados. O procedimento armazenado File_SplitIntoFields retorna um conjunto de resultados onde cada linha é uma linha do arquivo de entrada, mas cada campo no arquivo é uma coluna separada. Por padrão, o tipo de dados para cada campo é
NVARCHAR(MAX)
, mas há um parâmetro de entrada opcional para especificar qual deve ser o tipo de dados exato de cada coluna. Isso torna bastante fácil de fazer:E há um procedimento armazenado equivalente chamado INET_SplitIntoFields que faz a mesma coisa, mas em vez de obter os dados de um arquivo, ele os transmite diretamente de uma URL (portanto, não é necessário baixar o arquivo localmente primeiro).
Para exportar, existe um procedimento armazenado chamado DB_BulkExport que combina muitos dos recursos do SQLCMD e do SSIS. Eu criei isso depois de precisar fazer várias exportações e não conseguir decidir entre SQLCMD e SSIS, pois cada um tem seus prós e contras, e cada um tem um ou dois recursos que o outro não possui, mas todos esses recursos foram precisava. Por exemplo, DB_BulkExport não precisa de nenhuma especificação de campo de saída codificada e pode manipular
SELECT *
consultas (algo que não consegui descobrir como gerenciar no SSIS, mas foi fácil com o SQLCMD). Ele também pode lidar com a qualificação de texto dos campos sem ter que atualizar a consulta de origem para concatenar as aspas duplas (o que torna a consulta muito feia e difícil de manter). Na verdade, ele pode ser definido para qualificar TODOS os campos de texto ou apenas os campos que precisam dele com base em seu tipo de dados (strings, datas, GUIDs etc.).