Удаленный запрос с переменной с использованием MSDASQL
Я пытаюсь создать запрос для отчета SSRS. Мне нужно получить транзакции за последние 3 месяца со связанного сервера (на iSeries).
Итак, я создал переменную 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
не любит использовать переменную
Какой правильный способ сделать это?
2 ответа
Решение
С помощью 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
Спасибо
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