none
Erro ao excluir dados atraves do Linked Server RRS feed

  • Pergunta

  • Prezados,

    Estou com um erro na hora de excluir dados de uma tabela através de um linked server no SQL Server 2005. O sintoma que ocorre é a exclusão de dados fora do critério de filtro dos dados. O ambiente é o seguinte:

    ServidorProcesso - Onde está rodando a Stored Procedure
    ServidorDados - Onde os dados estão armazenados

    Estrutura da tabela:
    Create Table dbo.tblA (
    ID int Identity(1,1) Primary key,
    Data datetime,
    Nome varchar(100),
    Endereco varchar(200)
    )

    Query sendo executada do ServidorProcesso:

    Declare @SQL nvarchar(max)
    Set @SQL = 'DELETE from @SVR.Banco.dbo.tblA
    WHERE Data = dbo.fn_UmDoMes(''@Data'') --Função que retorna o primeiro dia do mes
    '
    SET @SQL = REPLACE(@SQL, '@SVR', 'ServidorDados')
    SET @SQL = REPLACE(@SQL, '@Data', cast('20081015' as datetime))
    Exec sp_executesql @sql

    esta tabela ficticia tblA tem mais de 100000 registros e o que ocorre é que os dados que são excluidos não são apenas os dados do mes 10/2008, mas alguns onde a data seria de outros meses.

    Alguem sabe que bug é esse? já contornei o problema, mas gostaria de saber por que isso ocorre.

    Grato pela ajuda,
    Felipe Nogueira

    terça-feira, 11 de novembro de 2008 17:16

Todas as Respostas

  • Boa Tarde Felipe,

     

    Seja bem vindo ao fórum de SQL Server do Technet.

     

    Nós participantes do fórum tentaremos ajudá-lo através da nossa disponibilidade, experiência e conhecimento na resolução de suas dúvidas e solução de seus problemas.

     

    O SQL Server 2005 possui novidades em relação a consultas distribuídas (que inclusive podem melhorar o desempenho). Vale a pena lembrar que o tipo de dados DateTime pode ser passado como string. Eu sugeriria a seguinte construção:

     

    Code Snippet

    Declare @SQL nvarchar(max)

    Set @SQL = 'DELETE from Banco.dbo.tblA

    WHERE Data = dbo.fn_UmDoMes(''@Data'')

    --Função que retorna o primeiro dia do mes'

    SET @SQL = REPLACE(@SQL, '@Data', '20081015')

    exec (@sql) AT [ServidorDados]

     

     

    [ ]s,

     

    Gustavo

    terça-feira, 11 de novembro de 2008 18:17
  • Obrigado pelas boas vindas e pelo snippet!

    Eu ainda tenho o problema pq o servidor é dinamico e não posso fixa-lo no codigo da procedure e a função usada é do ServidorProcesso.

    terça-feira, 11 de novembro de 2008 20:53
  • Olá Fil2000nog,

     

    Bom, então retire apenas o convert para ver se passa. Pode passar o dado como string mesmo.

     

    [ ]s,

     

    Gustavo

     

    terça-feira, 11 de novembro de 2008 20:55
  • Obrigado Gustavo!

    Testei, mas ele continua apagando dados que não são do mês passado como parâmetro. É como se o SQL Server estivesse se perdendo ao filtrar apenas a data passada.

    []´s,
    Fil
    quarta-feira, 12 de novembro de 2008 12:28
  • Fil,

     

    Como esta a configuração da linguagem do usuário que você esta utilizando no Linked Server para deletar estes dados, o que esta aparecendo é que você esta passando os valores de data em um formato, mas na outra ponta esta sendo reconhecido de forma diferente!!!

    quarta-feira, 12 de novembro de 2008 13:36
    Moderador
  • Esta função retorna um valor DateTime. Quando eu coloco uma data fixa, sem chamar a função, a exclusão ocorre com sucesso, porém quando a função é chamada, dá esse erro.

    Essa função retorna uma data fixa. Resolvi o problema colocando a data sendo passada por referencia, e não chamando a função, ou seja, eu chamo a função e guardo o valor do retorno dela em uma variável e depois passo essa variável para o sp_ExecuteSQL. Dessa forma eu otimizei o código para que não precise chamar a função a cada registro da consulta, mas ainda não explica o erro ocorrido.

    Acho que tem alguma coisa a ver com a chamada da função estando no servidor de origem. Percebi que no seervidor de destino um cursor é aberto para excluir os dados. Não tenho a minima noção do porque ele faz isso, mas para isso ele precisa ficar indo e voltando no servidor de origem para buscar o valor de retorno da função. Acredito que a fonte dos problemas esteja aí.

    Gostaria de saber se esse "bug" já foi relatado para a MS.
    quarta-feira, 12 de novembro de 2008 19:50