Pergunta

Estou escrevendo um script que deve ser executado em vários servidores e selecionar vários dados deles, incluindo o servidor local.O SQL necessário para SELECIONAR os dados que preciso é bastante complicado, então estou escrevendo uma espécie de visualização ad-hoc e usando uma instrução OPENQUERY para obter os dados, então, no final das contas, acabo fazendo um loop em uma instrução como esta:

exec('INSERT INTO tabl SELECT * FROM OPENQUERY(@Server, @AdHocView)')

No entanto, ouvi dizer que usar OPENQUERY no servidor local é desaprovado.Alguém poderia explicar por quê?

Foi útil?

Solução

  • Embora a consulta possa retornar vários conjuntos de resultados, OPENQUERY retorna apenas o primeiro.
  • OPENQUERY não aceita variáveis ​​para seus argumentos.
  • OPENQUERY não pode ser usado para executar procedimentos armazenados estendidos em um servidor vinculado.Entretanto, um procedimento armazenado estendido pode ser executado em um servidor vinculado usando um nome de quatro partes.
  • Se o sp_addlinkedserver o procedimento armazenado é usado no mesmo script, as credenciais usadas no servidor remoto são codificadas no script, visíveis para qualquer pessoa que tenha uma cópia

Referência:

Outras dicas

Além do que o @omg Ponies disse, é simplesmente desnecessário. Não há razão para introduzir a consulta ad-hoc e distribuir a semântica da transação quando você não precisa. Quando você usa OPENQUERY Você assume todos os aspectos negativos do SQL dinâmico, incluindo planos menos previsíveis e a incapacidade do servidor de rastrear com precisão as dependências.

OPENQUERY Também exige que o usuário local tenha permissões para o servidor de destino, o que provavelmente não é o que você deseja, a menos que seja um script administrativo. Você não pode esperar que todos os usuários de um banco de dados tenham as mesmas permissões para todos os outros bancos de dados.

Apenas um acompanhamento.

OpenQuery é bom quando você precisa comparar ou manipular algumas fileiras de procedimentos armazenados.

por exemplo, se você precisar comparar os resultados de dois servidores (servidor de teste e lançamento) quando migrar de SQL Server 2005 para SQL Server 2008 Por exemplo, você pode fazer a seguinte consulta:

select * into test_table from OpenQuery(testServer, 'exec testdb.dbo.test_sp');
select * into rollout_table from OpenQuery(rolloutServer, 'exec testdb.dbo.test_sp');

select * from test_table
except
select * from rollout_table;

select * from rollout_table
except
select * from test_table;

para ver quaisquer discrepâncias.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top