/ Consulta remota com variável usando MSDASQL - tsql, sql-server-2008-r2, servidor vinculado, openquery, msdasql

Consulta remota com variável usando MSDASQL - tsql, sql-server-2008-r2, servidor vinculado, openquery, msdasql

Eu estou tentando criar uma consulta para um relatório do SSRS. Eu preciso obter as últimas transações de 3 meses de um servidor vinculado (para um iSeries).

Então eu construí uma variável SQL que eu quero executar com o OpenQuery

declare @EarliestDate varchar(8), @SQL VARCHAR(200), @sDate varchar(8)

SET @EarliestDate=CAST(DATEPART(YEAR,DATEADD(m,-3, getdate())) AS VARCHAR(4))
+ RIGHT("00" + CAST(DATEPART(mm, DATEADD(m,-3, getdate())) AS varchar(2)), 2)+ "01"

SELECT @SQL= "SELECT * FROM YEDB03P WHERE TCDAT  >" + """" + @EarliestDate +"""" + " ORDER BY TCDAT DESC"
print @EarliestDate
print @SQL

select * from openquery(BOCTEST2,@SQL)

Mas parece que openquery não gosta de usar uma variável

Qual é a maneira correta de fazer isso?

Respostas:

1 para resposta № 1

OPENQUERY não aceita variáveis ​​para seus argumentos.

Mas você pode mover toda a instrução OPENQUERY para seu SQL dinâmico:

declare @EarliestDate varchar(8), @SQL VARCHAR(MAX), @sDate varchar(8)

SET @EarliestDate=CAST(DATEPART(YEAR,DATEADD(m,-3, getdate())) AS VARCHAR(4))
+ RIGHT("00" + CAST(DATEPART(mm, DATEADD(m,-3, getdate())) AS varchar(2)), 2)+ "01"

SELECT @SQL= "select * from openquery(BOCTEST2, ""SELECT * FROM YEDB03P WHERE TCDAT  >" + """""" + @EarliestDate +"""""" + " ORDER BY TCDAT DESC"")"
print @EarliestDate
print @SQL

EXEC @SQL

0 para resposta № 2

com a ajuda de Oleksandr Kucher Eu consegui fazer o que eu quero com o código abaixo (eu adicionei char(39) para a string de consulta para forçar as aspas):

 declare @EarliestDate varchar(8), @SQL NVARCHAR(1000), @sDate varchar(8)

SET @EarliestDate= CAST(DATEPART(YEAR,DATEADD(m,-3, getdate())) AS VARCHAR(4))
+ RIGHT("00" + CAST(DATEPART(mm, DATEADD(m,-2, getdate())) AS varchar(2)), 2)+ "01"

SELECT @SQL= "insert into DBO.YEDB03P select * from openquery(BOCTEST2, ""SELECT * FROM YEDB03P WHERE TCDAT  >"+char(39)+CHAR(39) + @EarliestDate  +char(39)+CHAR(39)  + " ORDER BY TCDAT DESC"")"

--print @SQL

/*
The prints as

insert into DBO.YEDB03P select * from openquery(BOCTEST2, "SELECT * FROM YEDB03P WHERE TCDAT  >""20141001"" ORDER BY TCDAT DESC")

*/
exec sp_executesql @SQL
select * from PION..YEDB03P

obrigado