我正在使用 SQL Server 2012 和 SSRS。使用 this 非常有用的答案,我有一个参数化查询,可以通过 openquery 从 DB2 系统中提取数据。我想将其制作成 SSRS 报告。我不知道如何使用查询来完成此操作,因此我构建了一个小存储过程来包装查询,如下所示:
ALTER PROCEDURE dbo.QueryInfoByID
-- Add the parameters for the stored procedure here
@inputid varchar(10),
@outputfield varchar(50) output
AS
BEGIN
DECLARE @TSQL varchar(8000);
SELECT @TSQL = 'SELECT * FROM OPENQUERY(IMG2677,''SELECT outputfield FROM mytable WHERE outputfield = ''''' + @inputid + ''''''')'
EXEC (@TSQL)
END
如何将@TSQL中嵌入的outputfield与SP输出参数列表中的@outputfield连接起来?我尝试过一些谷歌搜索,但找不到任何可以解决这个问题的内容。如果这是一个新手问题,我们深表歉意;我没有对存储过程中的输出参数做太多事情。
我相信您只需要更改动态查询即可考虑参数。
ALTER PROCEDURE dbo.QueryInfoByID
-- Add the parameters for the stored procedure here
@inputid varchar(10),
@outputfield varchar(50) output
AS
BEGIN
DECLARE @TSQL varchar(8000);
SELECT @TSQL = 'SELECT * FROM OPENQUERY(IMG2677,''SELECT '''' + @outputfield + '''' FROM mytable WHERE '''' + @outputfield + ''''= ''''' + @inputid + ''''''')'
EXEC (@TSQL)
END
您应该没有理由不能执行与运行交互时使用的相同查询。您甚至不需要存储过程来执行此操作。但是,SSRS 帐户可能没有执行该命令的访问权限。
我过去通过创建一个新的 SQL Server 登录名、授予正确的权限并使用该帐户执行 SQL 语句来完成此操作(实际上我一开始就授予它完全访问权限以证明它有效,然后删除了不必要的访问权限)。
例如,我创建了一个名为 AceDriverLogin 的登录名,直接在服务器上访问 Excel 文件时使用该登录名。
然后构建您的 SQL 语句(在您的情况下,您已经在 @TSQL 中完成了此操作)。然后使用以下语法执行该语句。
EXEC (@TSQL) AS LOGIN= 'AceDriverLogin'
我知道已经六年了。但如果其他人遇到同样的问题,请考虑使用 EXEC sp_executesql @TSQL。
sp_executesql 生成 SQL Server 可以重用的执行计划,而 EXEC 命令可能会导致无法重用的一次性内存浪费计划。