使用嵌入式TSQL执行字符串生成SSRS报告的输出参数

问题描述 投票:0回答:3

我正在使用 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连接起来?我尝试过一些谷歌搜索,但找不到任何可以解决这个问题的内容。如果这是一个新手问题,我们深表歉意;我没有对存储过程中的输出参数做太多事情。

sql-server stored-procedures reporting-services parameters openquery
3个回答
1
投票

我相信您只需要更改动态查询即可考虑参数。

  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

1
投票

您应该没有理由不能执行与运行交互时使用的相同查询。您甚至不需要存储过程来执行此操作。但是,SSRS 帐户可能没有执行该命令的访问权限。

我过去通过创建一个新的 SQL Server 登录名、授予正确的权限并使用该帐户执行 SQL 语句来完成此操作(实际上我一开始就授予它完全访问权限以证明它有效,然后删除了不必要的访问权限)。

例如,我创建了一个名为 AceDriverLogin 的登录名,直接在服务器上访问 Excel 文件时使用该登录名。

然后构建您的 SQL 语句(在您的情况下,您已经在 @TSQL 中完成了此操作)。然后使用以下语法执行该语句。

EXEC (@TSQL) AS LOGIN= 'AceDriverLogin'

0
投票

我知道已经六年了。但如果其他人遇到同样的问题,请考虑使用 EXEC sp_executesql @TSQL。

sp_executesql 生成 SQL Server 可以重用的执行计划,而 EXEC 命令可能会导致无法重用的一次性内存浪费计划。

© www.soinside.com 2019 - 2024. All rights reserved.