Pergunta

[Usando o SQL Server 2008 R2 Enterprise x64 SP1]

Estou tentando usar alguma forma de GETDATE() para passar a data de hoje para um procedimento armazenado dentro OPENQUERY(), mas continuo recebendo o erro

Msg 8114, Nível 16, Estado 1, Procedimento spCalcProjection, Linha 0
Erro ao converter o tipo de dados nvarchar para datetime

Aqui está o código (spCalcProjection leva um datetime):

SELECT top 1 multi FROM OPENQUERY([production], 'exec proddb.dbo.spCalcProjection "GETDATE()"')

Se eu usar 2014-05-22 ou qualquer literal no lugar de GETDATE() então não tenho problemas e obtenho o resultado correto e esperado.Se eu usar alguma outra funcionalidade como CAST(GETDATE() AS DATE) ou CONVERT(varchar, GETDATE(), 112) então recebo o erro acima novamente.

Foi útil?

Solução 2

Recebi uma resposta de outro lugar que usarei:

SELECT top 1 multi FROM OPENQUERY([production], 'DECLARE @dt datetime SELECT @dt = GETDATE() exec proddb.dbo.spCalcProjection @dt')

Isso evita a necessidade de criar objetos adicionais no banco de dados.

Outras dicas

Conrad, postar o erro de sintaxe original para GETDATE() sem aspas duplas pode ajudar mais do que você pensa.Também não vejo por que você precisaria escapar da função aqui.(Desculpe, não é possível adicionar ao seu tópico com Lamak, não há reputação suficiente para comentários).Além disso, por que você precisa de uma consulta aberta para ligar para seu sp?Quando você diz SQL Server 2008 R2, ele está no lado da chamada e no servidor [de produção]?Se a outra extremidade não for o SQL Server, pode não ter a função GETDATE().Se a outra extremidade for o SQL Server, você não precisará do OpenQuery.

[ATUALIZAR]Acho que tenho sua resposta.Você não pode usar uma função como parâmetro para procedimento armazenado.Não tem nada a ver com consulta aberta.O que você pode fazer é substituir esse procedimento armazenado por uma função com valor de tabela.Eu apenas tentei e funcionou.

Definição:

CREATE FUNCTION TestFun
(
    @TestDateParam datetime
)
RETURNS 
@RetTable TABLE 
(
    Line nvarchar(20)
)
AS
BEGIN
    INSERT INTO @RetTable
    SELECT aString
        FROM sometable
        WHERE aDate = @TestDateParam

    RETURN 
END

Chamar:

SELECT *
FROM dbname.dbo.TestFun(GETDATE())
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top