se eu selecionar mais de 15 campos, recebo uma falha catastrófica

3

Usando o SQL Server 2012, estou conectando a um servidor vinculado com o Pervasive SQL.

Quando eu faço select * ou select field1,field2,field3....field15 estou recebendo este erro:

Msg 7399, Level 16, State 1, Line 1
The OLE DB provider "MSDASQL" for linked server "KSLAP208" reported an error. The provider reported an unexpected catastrophic failure.
Msg 7330, Level 16, State 2, Line 1
Cannot fetch a row from OLE DB provider "MSDASQL" for linked server "KSLAP208".

Eu sinto que há algum tipo de problema de memória? Não permitirá que eu selecione mais do que uma certa quantidade de dados?

ao passo que, se eu selecionar uma pequena quantidade de dados select field1,field2 , isso funcionará sem problemas.

O que estou fazendo de errado?

    
por l--''''''---------'''''''''''' 08.02.2013 / 20:28

3 respostas

2

Um post no site da Microsoft sugere que você pode contornar este problema desabilitando a pré-busca de consultas para o servidor vinculado .

In the ODBC Data Source Administrator panel on the server, configure your linked server from System DSN. Under the Performance tab, uncheck the box 'Enable pre-fetch of data for queries'. OK, OK. Delete and re-create your linked server in SQL Management Studio.

You can disable the prefetch by clearing the "Enable pre-fetch of data for queries" check box in the Performance tab when creating a DSN or adding "PREFETCH=0" to the connection string when creating a DSN-less connection.

Como não tenho acesso à área de download da Pervasive (e a conexão ODBC do SQL Server parece completamente diferente na instalação do Server 2012), não consegui testar isso. Ainda pode te ajudar de qualquer maneira ...

    
por 14.02.2013 / 05:52
1

Isso funciona: SELECT TOP 1 field1, field2, field3 .... field15.
Se sim, que tal SELECT TOP 10 campo1, campo2, campo3 .... campo15.
Se sim, e quanto a SELECT TOP 100 campo1, campo2, campo3 .... campo15.
Repita, etc.

Supondo que ele seja interrompido em algum momento, adicione uma cláusula ORDER BY para uma coluna (ou conjunto de colunas) que seja exclusiva. Repita e ajuste o número de linhas até identificar o culpado. Digamos, por exemplo, o SELECT TOP 12345 funciona, mas o SELECT TOP 12346 não. (Um bom ORDER BY é importante aqui para garantir que ele retorne o mesmo conjunto de dados todas as vezes.) Agora use um intervalo da cláusula WHERE para obter apenas uma pequena quantidade de dados que aparece na parte inferior de seus dados "bons". Aumente o intervalo WHERE um pouco para incluir a linha ruim. Se funcionar agora, então isso aponta para a quantidade de dados, que pelo menos prova seu palpite original, e se ele ainda errar, vá para a linha que seria 12346 naquela consulta e veja se há algo estranho com ela.

Eu posso explicar se isso te leva a algum lugar.

    
por 14.02.2013 / 05:17
1

Eu sei que essa pergunta foi feita há muito tempo, mas para pessoas que usam o Google e se deparam com esse post ...

Eu assumo que a consulta é de ouro quando você a executa no servidor ao qual você está vinculado?

Qual é a sua consulta exata?

Você está fazendo:

Select * from "the linked server"

-ou -

Select * from openquery("the linked server",'Select * from "the table"')

Existe uma diferença:

  1. O primeiro puxa TODOS os registros do servidor remoto e faz a consulta no seu servidor local.
  2. O segundo executa a consulta no servidor remoto primeiro. O servidor remoto envia apenas o conjunto de resultados.

Existe a possibilidade de tempo limite, mas não acho que seja esse o problema que você está tendo.

Encontrei um problema fazendo um servidor vinculado a mysql . Eu tentei # 1 acima e parece que me lembro de ter o mesmo erro não útil. Acontece que o # 1 só funciona (ou funciona melhor) com outros servidores SQL. Quando ligado a um servidor não-SQL, você tem que usar # 2 (openquery).

    
por 17.06.2013 / 02:48