2014-12-18 4 views
0

Я пытаюсь создать запрос для отчета SSRS. Мне нужно получить последние 3 месяца транзакций с связанного сервера (с iSeries).Удаленный запрос с переменной с использованием MSDASQL

Так что я построил переменную SQL, которую я хочу выполнить с 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) 

Но мне кажется, что openquery не нравится использовать переменную

Что такое правильный способ сделать это?

+1

возможно дубликат [включая параметры в OPENQUERY] (http://stackoverflow.com/questions/3378496/in cluding-parameters-in-openquery) – Pred

ответ

0

с помощью Oleksandr Kucher мне удалось сделать то, что я хочу на код ниже (я добавил char(39) к строке запроса, чтобы заставить кавычки):

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 

благодаря

1

OPENQUERY не принимает переменные для своих аргументов.

Но вы можете переместить весь о OPENQUERY в динамическом SQL:

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

Мне пришлось немного изменить его (добавив дополнительную цитату), но он работает с 'sp_executeSQL', поэтому спасибо –

+0

Отлично! Да, я не тестировал запрос, поэтому он может быть не идеальным с точки зрения одинарных кавычек, которые являются кошмаром при использовании динамического SQL :) –

Смежные вопросы