1

我正在尝试为 SSRS 报告创建查询。我需要从链接服务器(到 iSeries)获取最近 3 个月的交易。

所以我建立了一个我想用 OpenQuery 执行的 SQL 变量

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不喜欢使用变量

这样做的正确方法是什么?

4

2 回答 2

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
于 2014-12-18T15:54:21.533 回答
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

谢谢

于 2014-12-18T16:59:27.763 回答