Tudo, eu tenho uma consulta de exportação BCP. Está falhando com a mensagem de erro inútil no uso do BCP:
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 mantém os valores de identidade] [-h "carregar dicas"] [-x gera arquivo de formato xml] [-d nome do banco de dados] NULL
A consulta que estou usando é a seguinte
DECLARE @SQL VARCHAR(8000);
SELECT @SQL = 'bcp "EXEC ispsSelectEmptyAsNull ''B1A'';"
queryout "F:\aaData\IPACostData\R15TData\2BSHAEOS_B1A_20121120.txt"
-f "F:\aaData\IPACostData\R15TData\tmpFormatCard_B1A.fmt" -T -S' + @@SERVERNAME + '';
EXEC xp_cmdshell @SQL;
GO
onde se eu substituir EXEC ispsSelectEmptyAsNull ''B1A'';
por SELECT * FROM B1A;
não há problema. A própria consulta EXEC ispsSelectEmptyAsNull ''B1A'';
é executada sem problemas e retorna o conjunto de resultados correto. Executei um milhão de consultas BCP, mas nunca usei um SP para fornecer o conjunto de resultados. Estou fazendo isso correto?
O SP é o seguinte:
IF EXISTS (SELECT name
FROM sys.procedures
WHERE name = N'ispsSelectEmptyAsNull')
DROP PROCEDURE ispsSelectEmptyAsNull;
GO
CREATE PROCEDURE ispsSelectEmptyAsNull @TableName NVARCHAR(256)
AS
DECLARE @Columns VARCHAR(MAX);
SELECT @Columns =
COALESCE(@Columns + N',
NULLIF([' + CAST(COLUMN_NAME AS VARCHAR) + N'], '''') AS ' + COLUMN_NAME + '',
N'NULLIF([' + CAST(COLUMN_NAME AS VARCHAR) + N'], '''') AS ' + COLUMN_NAME + '')
FROM (SELECT DISTINCT COLUMN_NAME
FROM [IPACostAdmin].INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @TableName) AS H
ORDER BY COLUMN_NAME;
DECLARE @SQL NVARCHAR(MAX);
SET @SQL = N'
SELECT ' + @Columns + N'
FROM ' + @TableName + N';';
-- SELECT CONVERT(XML, @SQL);
EXEC (@SQL);
GO
Muito obrigado pelo seu tempo.
Obs. Eu não me importo com injeção de SQL etc.
Você tem CR\LF na invocação do shell, um não-não. Faça uma única linha:
A princípio eu tentaria mudar tudo para ficar na mesma linha:
Em vez de:
Altere para:
E então, pelo menos, o bcp analisará corretamente e você verá a saída adequada.
Não tenho certeza, mas é tão simples quanto adicionar duas aspas simples à sua declaração sobre B1A?
Seu:
Minha:
Você pode até precisar de duas aspas simples extras em torno de B1A.