【问题标题】:Using a temporary table on SRSS report在 SSRS 报告中使用临时表
【发布时间】:2020-01-17 10:49:29
【问题描述】:

我有一个存储过程,它在 sql server 端没有问题。但是,当我使用此存储过程提供 SRSS 报告时,我遇到了错误,例如: 对象名称“##tempTable”无效。

这是我的存储过程;

ALTER PROCEDURE [dbo].[Link_SP_Inventory]
    -- Add the parameters for the stored procedure here
    @StoreId int,
    @StartDate date,
    @EndDate date
AS


BEGIN

DECLARE @QUERY nvarchar(MAX);

SET @QUERY = N'SELECT * INTO ##tempTable ' + 
           N'FROM OPENQUERY("172.11.111.11", N''EXEC [DB].dbo.SP_inventory ' +  CONVERT(varchar(10),@StoreId) + ','  + '''' + QUOTENAME(CONVERT(varchar,@StartDate,112),'''') + '''' + ',' +  '''' + QUOTENAME(CONVERT(varchar,@EndDate,112) + '''','''') + ')';

           EXEC sp_executesql @QUERY;


    SET NOCOUNT ON;

    SELECT * FROM ##tempTable
    drop table ##tempTable
END

GO

我该如何解决这个问题?谢谢。

【问题讨论】:

标签: sql-server tsql reporting-services


【解决方案1】:

动态语句中引用的表只能在该动态语句中引用。采取这个简单的查询:

EXEC sp_executesql N'SELECT 1 AS I INTO #temp;';

SELECT *
FROM #temp;

注意语句失败:

消息 208,第 16 级,状态 0,第 3 行
无效的对象名称“#temp”。

但是,您似乎不需要临时表,这可以正常工作:

ALTER PROCEDURE [dbo].[Link_SP_Inventory]
    -- Add the parameters for the stored procedure here
    @StoreId int,
    @StartDate date,
    @EndDate date
AS


BEGIN

    DECLARE @QUERY nvarchar(MAX);

    SET @QUERY = N'SELECT * ' + 
                N'FROM OPENQUERY("172.11.111.11", N''EXEC [DB].dbo.SP_inventory ' +  CONVERT(varchar(10),@StoreId) + ','  + '''' + QUOTENAME(CONVERT(varchar(8),@StartDate,112),'''') + '''' + ',' +  '''' + QUOTENAME(CONVERT(varchar(8),@EndDate,112) + '''','''') + ')';

    EXEC sp_executesql @QUERY;

END;

【讨论】:

  • 完美,但现在我无法将这些列放入 SRSS 报告中。在成功加载参数时,我有一个没有任何列的数据集。
  • 刷新列时是否给了SSRS默认值?
  • 你的意思是参数的默认值吗?
  • 不,当您刷新列时,您会收到一个弹出窗口,询问您获取数据集列的值。否则,您需要在 SSRS 中手动定义数据集中的列。
  • 我没有得到那个弹出窗口。
【解决方案2】:

试试这个

ALTER PROCEDURE [dbo].[Link_SP_Inventory]
    -- Add the parameters for the stored procedure here
    @StoreId int,
    @StartDate date,
    @EndDate date
AS


BEGIN

    DECLARE @QUERY nvarchar(MAX);

SET @QUERY = N'SELECT * INTO ##temp_global ' + 
       N'FROM OPENQUERY("172.11.111.11", N''EXEC [DB].dbo.SP_inventory ' +  CONVERT(varchar(10),@StoreId) + ','  + '''' + QUOTENAME(CONVERT(varchar,@StartDate,112),'''') '''' + ',' +  '''' + QUOTENAME(CONVERT(varchar,@EndDate,112) + '''','''') + ')';


 EXECUTE (@QUERY)

 SELECT * FROM ##temp_global

 DROP TABLE ##temp_global
END

【讨论】:

  • 什么是##temp_global
【解决方案3】:

我想我曾经有过这种情况,我必须首先使用指定的列名创建临时表,然后将其插入其中,以便您的数据集能够获取列名。所以这样的事情可能会起作用:

ALTER PROCEDURE [dbo].[Link_SP_Inventory]
    -- Add the parameters for the stored procedure here
    @StoreId int,
    @StartDate date,
    @EndDate date
AS


BEGIN

DECLARE @QUERY nvarchar(MAX);

CREATE TABLE ##tempTable ([ColumnOne] VARCHAR(10), [ColumnTwo] DATETIME) --Add required columns here

SET @QUERY = N'SELECT * FROM OPENQUERY("172.11.111.11", N''EXEC [DB].dbo.SP_inventory ' +  CONVERT(varchar(10),@StoreId) + ','  + '''' + QUOTENAME(CONVERT(varchar,@StartDate,112),'''') + '''' + ',' +  '''' + QUOTENAME(CONVERT(varchar,@EndDate,112) + '''','''') + ')';

INSERT INTO ##tempTable ([ColumnOne],[ColumnTwo])
EXEC (@QUERY);


SET NOCOUNT ON;

SELECT * FROM ##tempTable
DROP TABLE ##tempTable
END

GO

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2013-02-14
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多