Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

O uso de OPENQUERY (procedimento armazenado exec) para criar uma nova tabela temporária falha com o erro 11526


Tente isto:
SELECT *
FROM OPENQUERY("FOO\SQL2012", 'SET FMTONLY OFF; EXEC mySchema.myStoredProc;') X;

A razão para isso é que quando você executa um procedimento armazenado em um servidor vinculado, o provedor primeiro tenta determinar a forma do conjunto de linhas resultante. Ele faz isso emitindo SET FMTONLY ON; e, em seguida, executando sua declaração. Em um procedimento armazenado que não usa tabelas temporárias, isso funciona perfeitamente. O analisador de consulta basicamente faz uma simulação sem realmente buscar todos os dados, apenas os metadados (como mostrar um plano de execução estimado).

O problema é que quando o procedimento armazenado faz use tabelas temporárias, ele falha, porque os metadados da tabela temporária não existem:eles não podem ser coletados por meio da meta-análise que funciona para procedimentos armazenados que não usam tabelas temporárias. A cura, então, é manualmente SET FMTONLY OFF; dentro do lote que está executando o procedimento armazenado.

Esteja ciente de que usar esse método fará com que o procedimento armazenado execute duas vezes . A primeira vez para coletar os metadados (os dados sendo descartados) e a segunda vez para realmente retornar os dados. Se o procedimento armazenado chamado for particularmente caro ou tiver efeitos colaterais, talvez seja necessário fazer concessões.

Por fim, observe que esse truque não funciona em todos os procedimentos armazenados. Há coisas que os procedimentos armazenados podem fazer que apenas atrapalham o trabalho. Não conheço todas as possibilidades, mas uma delas está retornando vários conjuntos de registros.

Em resposta à sua atualização, SET FMTONLY OFF não funciona:você pode reestruturar seu SP para não usar uma tabela temporária ou usar uma tabela permanente com chave de sessão? Qualquer uma dessas opções poderia fazer o trabalho. No SQL Server 2012, você também tem a opção de transmitir dados com table- parâmetros de valor .

Você pode gostar de ler Como compartilhar dados entre procedimentos armazenados de Erland Sommarskog pois pode lhe fornecer inspiração para uma maneira de realizar seu propósito.