estou usando o SQL Server Management Studio 2018, criei um procedimento armazenado onde desejo gerar arquivos CSV
CREATE PROCEDURE generate_csv_files
AS
BEGIN
SET NOCOUNT ON;
DECLARE @country VARCHAR(MAX);
DECLARE @file_name VARCHAR(MAX);
DECLARE @query VARCHAR(MAX);
DECLARE @bcp_command VARCHAR(MAX);
DECLARE cursor1 CURSOR FOR
SELECT DISTINCT country
FROM Fishery_Landings;
OPEN cursor1;
FETCH NEXT FROM cursor1 INTO @country;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @file_name = 'C:\Users\Erevos\Desktop\' + @country + '.csv';
SET @query = 'SELECT Country, Year, Commodity_Group, MCS.main_commercial_species, presentation, preservation, volume_kg
FROM Fishery_Landings FL
JOIN Commodity_Group CG on FL.CGID = CG.CGID
JOIN Main_Commodity_Species MCS on MCS.MCSID = FL.MCSID
WHERE country = ''' + @country + '''';
SET @bcp_command = 'bcp "' + @query + '" queryout ' + @file_name + ' -c -T -S ' + @@SERVERNAME;
EXEC master..xp_cmdshell @bcp_command;
FETCH NEXT FROM cursor1 INTO @country;
END;
CLOSE cursor1;
DEALLOCATE cursor1;
END;
O erro que estou recebendo:
Msg 214, Nível 16, Estado 201, Procedimento master..xp_cmdshell, Linha 1 [Batch Start Line 1] O procedimento espera o parâmetro 'command_string' do tipo 'varchar'.
O que eu fiz
EXEC sp_configure 'mostrar opções avançadas', 1; RECONFIGURAR; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURAR;
Como faço para contornar esse erro?
Atualizar após alterar o VARCHAR(MAX) para VARCHAR(8000) Este erro produz:
uso: bcp {dbtable | consulta} {em | fora | consulta | format} datafile [-m maxerrors] [-f formatfile] [-e errfile] [-F firstrow] [-L lastrow] [-b batchsize] [-n native type] [-c character type] [-w wide character tipo] [-N mantém o não-texto nativo] [-V versão do formato do arquivo] [-q identificador entre aspas] [-C especificador de página de código] [-t terminador de campo] [-r terminador de linha] [-i arquivo de entrada] [- o outfile] [-a packetsize] [-S nome do servidor] [-U nome de usuário] [-P senha] [-T conexão confiável] [-v versão] [-R habilitação regional] [-k mantém valores nulos] [- E mantenha os valores de identidade][-G Autenticação do Azure Active Directory] [-h "load tips"] [-x gerar arquivo de formato xml] [-d nome do banco de dados] [-K intenção do aplicativo] [-l login timeout] NULL
Você não pode usar varchar(max) com xp_cmdshell. Quando você muda o
para
Deve funcionar.
Sua solução real aqui é não usar o inseguro e difícil de usar
xp_cmdshell
. Você está muito melhor fazendo isso no Powershell.Você pode executar isso dentro do cronograma usando o SQL Server Agent, que oferece suporte a scripts Powershell.