Todos, em SELECT Data Set Using Stored Procedure with BCP Error , @Remus Rusanu forneceu uma ótima solução para o problema. No entanto, isso evoluiu para outro problema: essa consulta BCP agora é executada
DECLARE @SQL VARCHAR(8000);
SELECT @SQL = 'bcp "EXEC [2BSHAEOS]..ispsSelectEmptyAsNull ''B1A'';" ' +
'queryout "F:\aaData\IPACostData\R15TData\2BSHAEOS_B1A_BCPTesting2.txt" ' +
'-f "F:\aaData\IPACostData\R15TData\tmpFormatCard_B1A.fmt" -T -S' + @@SERVERNAME + '';
EXEC master..xp_cmdshell @SQL;
GO
Isso estava falhando devido à ordem dos campos no arquivo .fmt em conflito com aqueles nos resultados do meu SP. Agora, seguindo uma reescrita do meu SP para obter a ordem dos campos no ORDINAL_POSITION
igual ao arquivo .fmt, a consulta de exportação BCP acima me dá
SQLState = S0002, NativeError = 208 Erro = [Microsoft][SQL Server Native Client 10.0][SQL Server]Nome de objeto inválido '#TmpTableColumnNames'. NULO
Editar: SP alterado onde o SP está
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 INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @TableName
ORDER BY ORDINAL_POSITION;
DECLARE @SQL NVARCHAR(MAX);
SET @SQL = N'
SELECT ' + @Columns + N'
FROM ' + @TableName + N';';
EXEC (@SQL);
GO
Dizer que essa coisa está me dando vontade de me enfiar no olho com uma vara longa e afiada é um eufemismo. Qualquer ajuda seria apreciada. Claramente, a partir deste link do MSDN, esse erro é um número de coluna inválido. Mas as ORDINAL_POSITIONS do .fmt e os resultados obtidos do SP são os mesmos!
Como escrevi no comentário ao seu post anterior:
Nenhuma tabela temporária ou bcp falhará!
Atualização 1: Aqui está um exemplo de como excluir colunas no arquivo de formato (*.fmt) para o utilitário bcp:
Observe o zero (0) no comprimento de Col2. Você pode encontrar este exemplo no BOL do SQL Server 2008 em:
ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.en/s10de_4deptrbl/html/30e0e7b9-d131-46c7-90a4-6ccf77e3d4f3.htm
Ou procure
Using a Format File to Skip a Table Column
em BOL.