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 № 1OPENQUERY 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